Что нового

[Данные, строки] Извлеч из логов нужные цифры

Nelsy

Знающий
Сообщения
35
Репутация
8
Здравствуйте! Помогите пожалуйста найти простой способ извлеч из логов нужные цифры.

К сожалению с функцией StringRegExp и составлением к ней Pettern у меня проблемы, а удобная функция для этого дела(_StringBetween ) была урезана, и теперь в ней не возможно использовать опцию включающую возможности StringRegExp. Может кто знает аналоги?

Код:
------------------------------------------------------------
  Gamelog
  Listener: Nelsy
  Session started: 2010.12.05 12:48:33
------------------------------------------------------------

   ...

[ 2010.12.05 12:53:33 ] (combat) <color=0xffbb6600>Gist Malakim places an excellent hit on you, inflicting 81.7 damage.
[ 2010.12.05 12:53:34 ] (combat) <color=0xffbb6600>Arch Gistum Marauder hits you, doing 20.5 damage.
[ 2010.12.05 12:53:34 ] (combat) <color=0xffbb6600>Arch Gistum Marauder places an excellent hit on you, inflicting 26.6 damage.
[ 2010.12.05 12:53:34 ] (combat) <color=0xffbb6600>Gist Malakim hits you, doing 63.8 damage.
[ 2010.12.05 12:53:34 ] (combat) <color=0xffbb6600>Gist Malakim hits you, doing 59.7 damage.
[ 2010.12.05 12:53:34 ] (combat) <color=0xffbbbb00>Your group of 800mm Heavy 'Scout' Repeating Artillery I hits Gist Malakim, doing 954.5 damage.
[ 2010.12.05 12:53:35 ] (combat) <color=0xffbb6600>Gist Malakim aims well at you, inflicting 74.0 damage.
[ 2010.12.05 12:53:35 ] (combat) <color=0xffbb6600>Gist Malakim hits you, doing 53.0 damage.
[ 2010.12.05 12:53:35 ] (combat) Gist Malakim misses you completely.
[ 2010.12.05 12:53:36 ] (combat) <color=0xffbb6600>Factory Guard Sentry places an excellent hit on you, inflicting 48.7 damage.
[ 2010.12.05 12:53:36 ] (combat) <color=0xffbb6600>Factory Guard Sentry places an excellent hit on you, inflicting 49.8 damage.
[ 2010.12.05 12:53:37 ] (combat) <color=0xffbb6600>Arch Gistum Marauder barely scratches you, causing 12.8 damage.
[ 2010.12.05 12:53:37 ] (combat) Arch Gistum Marauder misses you completely.
[ 2010.12.05 12:53:37 ] (combat) <color=0xffbb6600>Gist Malakim lightly hits you, doing 47.3 damage.
[ 2010.12.05 12:53:37 ] (combat) <color=0xffbb6600>Gist Malakim hits you, doing 52.3 damage.
[ 2010.12.05 12:53:37 ] (combat) <color=0xffbb6600>Gist Malakim barely scratches you, causing 34.8 damage.
[ 2010.12.05 12:53:37 ] (combat) <color=0xffbb6600>Gist Malakim places an excellent hit on you, inflicting 85.8 damage.
[ 2010.12.05 12:53:38 ] (combat) Gist Malakim misses you completely.
[ 2010.12.05 12:53:39 ] (combat) <color=0xffbb6600>Factory Guard Sentry places an excellent hit on you, inflicting 42.3 damage.
[ 2010.12.05 12:53:39 ] (combat) <color=0xffbb6600>Factory Guard Sentry lightly hits you, doing 24.4 damage.
[ 2010.12.05 12:53:39 ] (combat) <color=0xffbbbb00>Your group of 800mm Heavy 'Scout' Repeating Artillery I hits Gist Malakim, doing 1331.8 damage.
[ 2010.12.05 12:53:39 ] (combat) <color=0xffbb6600>Arch Gistum Marauder aims well at you, inflicting 24.6 damage.
[ 2010.12.05 12:53:39 ] (combat) <color=0xffbb6600>Arch Gistum Marauder aims well at you, inflicting 23.9 damage.
[ 2010.12.05 12:53:39 ] (combat) <color=0xffbb6600>Gist Malakim hits you, doing 57.5 damage.
[ 2010.12.05 12:53:39 ] (combat) <color=0xffbb6600>Gist Malakim aims well at you, inflicting 67.3 damage.
[ 2010.12.05 12:53:40 ] (combat) <color=0xffbb6600>Gist Malakim barely scratches you, causing 38.7 damage.
[ 2010.12.05 12:53:40 ] (combat) <color=0xffbb6600>Gist Malakim places an excellent hit on you, inflicting 88.9 damage.
[ 2010.12.05 12:53:40 ] (combat) Gist Malakim misses you completely.

   ...

Пример искомой строки в логе для извлечения нужных цифр:
Код:
[ 2010.12.05 12:53:39 ] (combat) <color=0xffbbbb00>Your group of 800mm Heavy 'Scout' Repeating Artillery I hits Gist Malakim, doing 1331.8 damage.
В строке из который мы будем брать цифры(пример: 1331.8 ) должны обязательно присудствовать:
  • Your
  • Malakim или Throne
  • damage
Искомые цифры:
  • 1331.8

Найденые данные-цифры, надо поместить в массив.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Nelsy
Попробуйте так:
Код:
#include <Array.au3>

$sFile = @ScriptDir & '\test.txt'
$sPattern = "(?:Your group of 800mm Heavy 'Scout' Repeating Artillery I|Gist Malakim|Gist Throne).*?\s(\d.*?)\s"

$hFile = FileOpen($sFile, 0)
$sText = FileRead($hFile)
FileClose($hFile)

$aResult = StringRegExp($sText, $sPattern, 3)
_ArrayDisplay($aResult)
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
Попробуйте так:
Код:
#include <Array.au3>
Dim $sResult

$hFile = FileOpen("log.txt", 0)
If $hFile = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
EndIf
While 1
	$sLine = FileReadLine($hFile)
	If @error = -1 Then ExitLoop
	$aResult = StringRegExp($sLine, "Your group of 800mm Heavy \'Scout\' Repeating Artillery I.*?[Gist Malakim |Gist Throne].*?([+-]?\d*\.\d+)(?![-+0-9\.]).*?damage\S",2)
	If IsArray($aResult) Then $sResult &= $aResult[1] & @LF
WEnd

FileClose($hFile)
$aResult = StringSplit(StringStripWS($sResult,3), @LF)
_ArrayDisplay($aResult)
 
Автор
N

Nelsy

Знающий
Сообщения
35
Репутация
8
К сути подобрались оба варианта, за что я вам очень признателен, но к сожалению в первом варианте идет отбор строк по одному из 3-ех критериев, из за этого в массив попадают лишние цифры.

Вариант представленный Garrett мне понравился больше всего, в нем правда тоже есть лишние цифры но их меньше.

За правильный вариант награжу спасибкой =) и за старания тоже!

ПС: Прикрепил к первому посту файлик лога.

Можно для проверки сделать чтоб в массив вписывалось еще название Gist Malakim или Gist Throne чьи цифры были занесены в массив, потому что в массив попадают не толкьо Gist Malakim или Gist Throne но и другие. Например запустив скрипт от Garrett с прикрепленным лог файлом в первом посте, скрипт берет цифры из таких строк
Код:
[ 2010.12.05 18:14:46 ] (combat) <color=0xffbbbb00>Your group of 800mm Heavy 'Scout' Repeating Artillery I barely scratches Arch Gistum Marauder, causing 360.6 damage.
и в $aResult[65] лежат цифры 360.6 этой строки.



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

Garrett сказал(а):
Попробуйте так:
Код:
#include <Array.au3>
Dim $sResult

$hFile = FileOpen("log.txt", 0)
If $hFile = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
EndIf
While 1
	$sLine = FileReadLine($hFile)
	If @error = -1 Then ExitLoop
	$aResult = StringRegExp($sLine, "Your group of 800mm Heavy \'Scout\' Repeating Artillery I.*?[Gist Malakim |Gist Throne].*?([+-]?\d*\.\d+)(?![-+0-9\.]).*?damage\S",2)
	If IsArray($aResult) Then $sResult &= $aResult[1] & @LF
WEnd

FileClose($hFile)
$aResult = StringSplit(StringStripWS($sResult,3), @LF)
_ArrayDisplay($aResult)
Нашел проблему, но как ее решить не знаю. Когда из вашего примера убераешь [Gist Malakim |Gist Throne] то ничего не меняется. Нужно правильно обозначить чтоб скрипт не брал цифры из строк в которых отсутствуют Malakim или Throne
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Nelsy,
Вам нужно получить только числа из строк, содержащих текст Your group of 800mm Heavy 'Scout' Repeating Artillery I и Gist Malakim или Your group of 800mm Heavy 'Scout' Repeating Artillery I и Gist Throne? Если да, то можно так попробовать:
Код:
#include <Array.au3>

$sFile = @ScriptDir & '\20101205_180544.txt'
$sString = "Your group of 800mm Heavy 'Scout' Repeating Artillery I"
$sPattern = "(?:" & $sString & ".*?Gist Malakim|" & $sString & "Gist Throne).*?\s(\d.*?)\s"

$hFile = FileOpen($sFile, 0)
$sText = FileRead($hFile)
FileClose($hFile)

$aResult = StringRegExp($sText, $sPattern, 3)
_ArrayDisplay($aResult)
 
Автор
N

Nelsy

Знающий
Сообщения
35
Репутация
8
Вот так почти идеально, но в массиве $aResult[0] лежит число не понятно откуда.
Код:
$aResult = StringRegExp($sLine, "Your.*?(?:Malakim|Throne).*?([+-]?\d*\.\d+)(?![-+0-9\.]).*?damage\S",2)

ПС: А все, врубился.. это оказывается размер массива там лежит.

madmasles, в вашем примере все работает безупречно ^_^. Спасибо огромное!
Только резутат почемуто поменьше при фильтрации разными скриптами один лог.
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
Nelsy [?]
Нужно правильно обозначить чтоб скрипт не брал цифры из строк в которых отсутствуют Malakim или Throne
Код:
;...
While 1
	$sLine = FileReadLine($hFile)
	If @error = -1 Then ExitLoop
	$aResult = StringRegExp($sLine, "Your group of 800mm Heavy \'Scout\' Repeating Artillery I.*?(Gist Malakim|Gist Throne).*?([+-]?\d*\.\d+)(?![-+0-9\.]).*?damage\S",2)
	If IsArray($aResult) Then $sResult &= $aResult[1] & "|" & $aResult[2] & @LF
WEnd
;...
 
Автор
N

Nelsy

Знающий
Сообщения
35
Репутация
8
Пожалуй тема исчерпана, Garrett брагадарю за еще 1 пример.
Благодоря всем вам я похоже начал понимать как устроена логика составления pattern для StringRegExp. :IL_AutoIt_1:
 
Верх