Что нового

Существует ли функция разбора параметров в логе

Nbv_tim

Новичок
Сообщения
47
Репутация
1
Существует строка типа
04.08.2017 [врплывпар] лалалаал tel=13,лалала=14, rel=16 и т.д.
таких строк несколько

есть ли быстрый способ вытаскивания значение параметров tel и rel из строки или необходимо проходить регуляркой?
 
Автор
N

Nbv_tim

Новичок
Сообщения
47
Репутация
1
ra4o сказал(а):
Печально это(( что то совсем с регуляркой Autoit не дружу
Не могли пример привести как можно сделать?
так понимаю нужно сделать pattern
наподобе
Код:
$pat = '(?)(?='tel=').*?'
:blink:
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
244
Я тоже не очень с регулярными выражениями дружу, но можно так :
Код:
$Text='04.08.2017 [врплывпар] лалалаал tel=13,лалала=14, rel=16'
$tel=StringRegExp($Text,'(?:tel=)(\d+)',1)
$lalala=StringRegExp($Text,'(?:лалала=)(\d+)',1)
$rel=StringRegExp($Text,'(?:rel=)(\d+)',1)
MsgBox(0,'','tel='&$tel[0]&@CR&'lalala='&$lalala[0]&@CR&'$rel='&$rel[0])
 
Автор
N

Nbv_tim

Новичок
Сообщения
47
Репутация
1
ra4o сказал(а):
Я тоже не очень с регулярными выражениями дружу, но можно так :
Код:
$Text='04.08.2017 [врплывпар] лалалаал tel=13,лалала=14, rel=16'
$tel=StringRegExp($Text,'(?:tel=)(\d+)',1)
$lalala=StringRegExp($Text,'(?:лалала=)(\d+)',1)
$rel=StringRegExp($Text,'(?:rel=)(\d+)',1)
MsgBox(0,'','tel='&$tel[0]&@CR&'lalala='&$lalala[0]&@CR&'$rel='&$rel[0])
а как можно перебор организовать в одном выражении например в строке
Код:
$Text='04.08.2017 [врплывпар] лалалаал tel=13,лалала=14, rel=16'
$p = '(?s)\[(.+)\]'
$hes=StringRegExp($Text,$p,1)
MsgBox(0,'',$hes[0])

то есть один раз выбрал далее хочу по этой строке найти еще '(?s)tel(.+)\,'
в Sed -e есть например разделитель ;
 
A

Alofa

Гость
Лучше приведите пример файла и что вы хотите получить.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
244
Не совсем пойму, что Вы хотите, но ведь здесь был ответ от кого-то из гуру с красивой регуляркой, удалили ?
Вот что у меня вышло :-[
Код:
#include <array.au3>
$Text='04.08.2017 [врплывпар] лалалаал tel=13,лалала=14, rel=16'
$p = '(?:=)(\d+)'
$hes=StringRegExp($Text,$p,3)
_ArrayDisplay($hes)
 
Автор
N

Nbv_tim

Новичок
Сообщения
47
Репутация
1
ra4o сказал(а):
Не совсем пойму, что Вы хотите, но ведь здесь был ответ от кого-то из гуру с красивой регуляркой, удалили ?
Вот что у меня вышло :-[
Код:
#include <array.au3>
$Text='04.08.2017 [врплывпар] лалалаал tel=13,лалала=14, rel=16'
$p = '(?:=)(\d+)'
$hes=StringRegExp($Text,$p,3)
_ArrayDisplay($hes)
да ответ удалили
но я успел сдуть)
Код:
$Arr1=StringRegExp($Text, "[^ .]+=[a-z]", 3)

для текста и
Код:
$Arr = StringRegExp($Text, "[^ ,]+=\d+", 3)
для цисла.

Спасибо за помощь, далее сам будут оформлять, основное понял.
 

InnI

AutoIT Гуру
Сообщения
4,650
Репутация
1,320
ra4o
Да, удалил. Потому что предложенная мной регулярка находила пары "параметр=цифры". Автор, насколько я понял, знает имена параметров. Поэтому проще сразу искать значение (как у вас), чем разбирать массив пар.

Nbv_tim
для текста и <...> для числа
Определитесь, что вам нужно. Искать значение конкретного параметра или найти все пары "параметр=значение" ?
Если нужны пары, в том числе для текста, да ещё и через точку, то можно так
Код:
$Text = "04.08.2017 [врплывпар] лалалаал tel=13,лалала=14, rel=лала . лалала=лалала"
$Arr = StringRegExp($Text, "[^ ,.]+=[^ ,.]+", 3)

#include <array.au3>
_ArrayDisplay($Arr)
 
Автор
N

Nbv_tim

Новичок
Сообщения
47
Репутация
1
InnI сказал(а):
ra4o
Да, удалил. Потому что предложенная мной регулярка находила пары "параметр=цифры". Автор, насколько я понял, знает имена параметров. Поэтому проще сразу искать значение (как у вас), чем разбирать массив пар.

Nbv_tim
для текста и <...> для числа
Определитесь, что вам нужно. Искать значение конкретного параметра или найти все пары "параметр=значение" ?
Если нужны пары, в том числе для текста, да ещё и через точку, то можно так
Код:
$Text = "04.08.2017 [врплывпар] лалалаал tel=13,лалала=14, rel=лала . лалала=лалала"
$Arr = StringRegExp($Text, "[^ ,.]+=[^ ,.]+", 3)

#include <array.au3>
_ArrayDisplay($Arr)


Да, это то что нужно. спасибо.
Правда появился еще один вопрос уже с дургим файлом.
есть в файле две строки :
1) 10:30:55.255 [kfsldkf] llalala - Add to: lalala-> (77777777)
2) 10:35:59.504 [lalala] lala -Send to: lalal -> (77777777)

если задаю регулярку
Код:
$Text=FileReadLine(@ScriptDir & "\" & "Parce" & "\" & "1.txt")
$p = '(?s)\ - (.+)\: '

$t='(.+?) '
$R='(?s)\->\((.+)\)'

$hes=StringRegExp($Text,$p,1)
$tes= StringRegExp($Text,$t,1)
$fes= StringRegExp($Text,$R,1)
MsgBox(0,'','Дата: '&$tes[0]&' Добавлено :' & $hes[0]& 'Номер : '&$fes[0])


для чтение строки нормально, но вторая строка уже не читается.
если же читаю файл целиком то начинается чертечто.
есть вариант читать файл на строки и если
Код:
StringInStr
находит Add to то тогда вызывается регулярка по номеру строки.Возможно есть более простой способ?
 

InnI

AutoIT Гуру
Сообщения
4,650
Репутация
1,320
Nbv_tim
Проблема-то в чём? В том, что вторая строка не читается? Так прочитайте её
Код:
$Text = FileReadLine(@ScriptDir & "\Parce\1.txt", 2)
 
Автор
N

Nbv_tim

Новичок
Сообщения
47
Репутация
1
InnI сказал(а):
Nbv_tim
Проблема-то в чём? В том, что вторая строка не читается? Так прочитайте её
Код:
$Text = FileReadLine(@ScriptDir & "\Parce\1.txt", 2)
да, так вторая строка читается.
однако тогда необходимо реализовывать подсчет строк и возвращать для значение строки
Код:
#include <File.au3>
$g=_FileCountLines(@ScriptDir & "\" & "Parce" & "\" & "1.txt")
 MsgBox(0,'',$g)

и соответственно делать перебор в цикле и для каждого параметра g выводить данные?
 

InnI

AutoIT Гуру
Сообщения
4,650
Репутация
1,320
Nbv_tim
Шаблон регулярного выражения - это алгоритм поиска. Естественно, он реализуется под конкретные данные: что и где искать. Если вы решили работать построчно, то нужно читать файл в массив (например, через FileReadToArray) и перебирать массив. Если читаете текстовый файл целиком, то и шаблон должен соответствовать. Но вы даже не объясняете, "что" нужно найти. Про "где" я уже молчу... одни сплошные "лалала".
 
Автор
N

Nbv_tim

Новичок
Сообщения
47
Репутация
1
InnI сказал(а):
Nbv_tim
Шаблон регулярного выражения - это алгоритм поиска. Естественно, он реализуется под конкретные данные: что и где искать. Если вы решили работать построчно, то нужно читать файл в массив (например, через FileReadToArray) и перебирать массив. Если читаете текстовый файл целиком, то и шаблон должен соответствовать. Но вы даже не объясняете, "что" нужно найти. Про "где" я уже молчу... одни сплошные "лалала".
Да, я осознаю что некорректно поставил вопрос.
Код:
##Global $tes,$hes,$fes,$p,$t,$R,$Text,
#include <File.au3>
 $p = '(?s)\ - (.+)\: '
     $t='(.+?) '
     $R='(?s)\->\((.+)\)'
	 
$g=_FileCountLines(@ScriptDir & "\" & "Parce" & "\" & "1.txt")
 for $i=1 to $g
	 $Text=FileReadLine(@ScriptDir & "\" & "Parce" & "\" & "1.txt", $i)
	 	 $hes=StringRegExp($Text,$p, 1)
$tes= StringRegExp($Text,$t,1)
$fes= StringRegExp($Text,$R,1)
MsgBox(0,'','Дата: '&$tes[0]&' Добавлено:' & $hes[0]& 'Номер : '&$fes[0] 	)

Next
вообщем реализовал так. всем спасибо за помощь.
 
Верх