Что нового

StringRegExp - не получается правильно сформировать массив

saavaage

Знающий
Сообщения
171
Репутация
17
есть текстовый файл (dict1.txt), содержащий следующие строки:
Код:
book|книга
table|стол
chair|стул
retail|розница
tail|хвост
dog|собака
horse|конь,лошадь

необходимо получить массив вида:
Код:
book
книга
table
стол
chair
стул
retail
розница
tail
хвост
dog
собака
horse
конь,лошадь
нашел в дебрях интернета следующую конструкцию:
Код:
$aRExp = StringRegExp($sText, "(?m)^\s*([^\s]+)\s+([^\s]+)", 3)

но она отрабатывает на пробел, а не на '|'

В регулярных выражениях я "ни бум-бум", прошу помощи...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
saavaage
В StringRegExp() я сам "плаваю", но так у меня работает:
Код:
#include <Array.au3>

$hFile = FileOpen('test.txt', 0)
$sText = FileRead($hFile)
FileClose($hFile)
$aText = StringSplit(StringStripCR(StringReplace($sText, '|', @LF)), @LF, 2)
_ArrayDisplay($aText)
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
По-моему предыдущий вариант не захватывает последнюю строчку

А вот мой вариант через через Рег.Выражения :
Код:
#include<Array.au3>
$hFile = FileOpen('test.txt', 0)
$sText = FileRead($hFile)
ConsoleWrite($sText& @LF)
$aText=StringRegExp($sText,"(.+?)(?:\||\r\n|$)",3)
_ArrayDisplay($aText)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
r35p3ct
Последняя строка (horse|конь,лошадь) съедается.
 

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
Не обратил внимание... :whistle:
Код:
$aRExp = StringRegExp($sText, '(\w*)\|(\S*)', 3)
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
Спасибо всем. Все предложенные варианты (вкл. последний r35p3ct) отрабатывают на 100%.
Вопрос - какой наиболее оптимальный (скорость обработки), если таких строк будет 10000 - 15000? Не просветите?
PS Сам испытать пока не могу, т.к. племянник еще не набивал слова в словари...
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
saavaage сказал(а):
Вопрос - какой наиболее оптимальный (скорость обработки), если таких строк будет 10000 - 15000? Не просветите?
PS Сам испытать пока не могу, т.к. племянник еще не набивал слова в словари...

Не обзательно набивать .
Для короткого теста мой вариант работает медленнее , чем вариант от r35p3ct
Ошибся наоборот
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
но есть небольшое но:
скрипт r35p3ct отрабатывает некорректно, если между "Конь, лошадь" есть, например, пробел, то "лошадь" съедается...
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
saavaage [?]
если между "Конь, лошадь" есть, например, пробел, то "лошадь" съедается...

Это все легко устраняется добавлением \s? (думаю автор устранит)
 

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
saavaage сказал(а):
но есть небольшое но:
скрипт r35p3ct отрабатывает некорректно, если между "Конь, лошадь" есть, например, пробел, то "лошадь" съедается...
Вариант с пробелом учитывается)

Код:
$aRExp = StringRegExp($sText, '(\w*)\|(\V*)', 3)
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
С оценкой быстродействия я ошибся (не там установил таймер)
все-таки скорость поже выше в моем варианте в 2 раза


Добавлено:
Сообщение автоматически объединено:

И еще в 2 раза быстрее работает вариант :
Код:
$aText=StringSplit($sText,"|" & @cr)
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
gregaz, уже пробовал такой вариант, но, к сожалению, он влечет такой некрасивый вывод: см. аттач
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
saavaage
Поставьте флаг 2
Код:
$aText=StringSplit($sText,"|" & @cr, 2)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
saavaage
У меня так быстрее всего работает:
Код:
$aText = StringSplit(StringStripCR($sText), '|' & @LF, 2)
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
gregaz, артефакты (квадратики - символы перехода на новую строку) остались

madmasles, спасибо

To all, пока сравнить не могу. Но, как дойдет до реального словаря, обязательно отпишусь по скорости обработки.

Спасибо всем еще раз!
 
Верх