Что нового

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

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,322
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
Репутация
967
Попробуйте так:
Код:
#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,322
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
Репутация
967
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:
 
Верх