Что нового

пакетная обработка логов

Glass4217

Чайник
Сообщения
53
Репутация
4
Версия AutoIt: 3.5.4

Описание: Всем добрый день, возникла по работе необходимость читать логи с касс. а у меня пока серьезный затык с обработкой регулярных выражений.
есть несколько файл-логов один чек выглядит как несколько строк:
Код:
480911;07.03.19;08:45:35;65;1;5894;19;0;0;0.00;0.000;0.00;
480912;07.03.19;08:48:07;11;1;5894;19;7004079;1;45.10;1.000;45.10;
480913;07.03.19;08:48:12;11;1;5894;19;7007402;1;73.40;2.000;146.80;
480914;07.03.19;08:48:15;11;1;5894;19;7007401;1;73.40;1.000;73.40;
480915;07.03.19;08:48:45;75;1;5894;19;1;1;265.30;0.000;40.47;
480916;07.03.19;08:48:40;40;1;5894;19;;0;34.70;1.000;300.00;
480917;07.03.19;08:48:45;54;1;5894;19;42382|3803250158|9289000100066214|20190307084900|;1;0.00;209.000;265.30;
480918;07.03.19;08:48:45;55;1;5894;19;;0;0.00;0.000;265.30;
формат:
Код:
Номер транзакции;Дата;Время;Тип транзакции;Номер ККМ;Номер чека;Код кассира;игнорируем;игнорируем;игнорируем;игнорируем;цена;
разделитель всегда ";" в игнорируемом тексте нет символа ;

собственно нужно ловить чеки где тип транзакции равен 56 и вывести данные по этому чеку в лог указывая дату, время и сумму чека.
примерно так:
Код:
	Line 315: 820957;12.06.19;09:50:24;56;1;5665;21;;0;0.00;0.000;-1133.45;
	Line 319: 820961;12.06.19;09:50:24;56;1;5665;21;;0;0.00;0.000;-96.21;
	Line 385: 821027;12.06.19;10:07:59;56;1;5671;21;;0;0.00;0.000;-397.40;
	Line 389: 821031;12.06.19;10:07:59;56;1;5671;21;;0;0.00;0.000;-290.90;
	Line 428: 821070;12.06.19;10:12:54;56;1;5673;21;;0;0.00;0.000;-1339.76;
	Line 430: 821072;12.06.19;10:12:54;56;1;5673;21;;0;0.00;0.000;-81.86;
	Line 444: 821086;12.06.19;10:15:06;56;1;5673;21;;0;0.00;0.000;-1683.99;
	Line 979: 821621;12.06.19;11:37:25;56;1;5712;21;;0;0.00;0.000;-919.43;
	Line 983: 821625;12.06.19;11:37:25;56;1;5712;21;;0;0.00;0.000;-157.70;
	Line 1199: 821841;12.06.19;12:20:25;56;1;5723;21;;0;0.00;0.000;-3504.23;
	Line 1205: 821847;12.06.19;12:20:25;56;1;5723;21;;0;0.00;0.000;-543.88;
	Line 1296: 821938;12.06.19;13:19:43;56;1;5733;21;;0;0.00;0.000;-1326.70;
	Line 1445: 822087;12.06.19;14:04:26;56;1;5742;21;;0;0.00;0.000;-425.76;
	Line 1516: 822158;12.06.19;14:12:23;56;1;5750;21;;0;0.00;0.000;-688.15;
	Line 1518: 822160;12.06.19;14:12:23;56;1;5750;21;;0;0.00;0.000;-54.66;
	Line 1622: 822264;12.06.19;14:22:49;56;1;5758;21;;0;0.00;0.000;-1304.00;
	Line 1627: 822269;12.06.19;14:22:49;56;1;5758;21;;0;0.00;0.000;-502.20;
	Line 1759: 822401;12.06.19;15:27:47;56;1;5769;21;;0;0.00;0.000;-450.10;
	Line 1763: 822405;12.06.19;15:27:47;56;1;5769;21;;0;0.00;0.000;-362.00;
	Line 2328: 822970;12.06.19;20:01:33;56;1;5823;21;;0;0.00;0.000;-174.94;
	Line 2334: 822976;12.06.19;20:01:33;56;1;5823;21;;0;0.00;0.000;-347.45;
	Line 2343: 822985;12.06.19;20:44:58;56;1;5825;21;;0;0.00;0.000;-233.00;
	Line 2360: 823002;12.06.19;20:47:38;56;1;5828;21;;0;0.00;0.000;-28.20;
или суммарные данные за файл как вариант.
Код:
20190612.log имеет отмененных чеков на сумму 16045,97
Файлов несколько сотен, в ручную обрабатывать к сожалению нет времени, а сам в регулярные выражения я туплю.
Задача в указанном каталоге обработать все файлы и выдать в файл-лог итог.
Выручайте ребята я сотрусь об эксель их выковыривать.
Примечания: полный файл лог во вложении
 

Вложения

sngr

AutoIT Гуру
Сообщения
940
Репутация
375
Код:
#include 'array.au3'
#include 'file.au3'
$aArr=_FileListToArray(@ScriptDir,'*.txt')
$zzz=''
For $i = 1 To  $aArr[0]
	$file=FileRead(@ScriptDir&'\'&$aArr[$i])
	$str=StringRegExp($file,'[^;]+;([^;]*;)([^;]*;)56;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;([^;]*);',3)
	For $y = 0 To UBound($str)-1 Step 3
		$zzz&=$str[$y]&$str[$y+1]&$str[$y+2]& @CRLF
	Next
Next
FileWrite(@ScriptDir&'\_123.log',$zzz)
 

xXx

Меценат
Меценат
Сообщения
85
Репутация
25
Код:
#include <File.au3>
Global $iSum, $FileList, $sStrOut
Global $sFileOut = '+ИТОГОВЫЙ+.log'
Global $sFindDir = @ScriptDir ; Папка c файлами

$FileList = _FileListToArray($sFindDir, '*.log', 1)
If @error Then Exit 11
$sFindDir = StringRegExpReplace($sFindDir, '[\\/]+$', '')
For $i = 1 To $FileList[0]
    $sRead = FileRead($sFindDir & '\' & $FileList[$i])
    If @error Then ContinueLoop
    $aArray = StringRegExp($sRead, '(?m)^\h*(?:[^;]*;){3}56;(?:[^;]*;){7}\h*([\d.-]+)', 3)
    If @error Then ContinueLoop
    For $j = 0 To UBound($aArray) - 1
        $iSum += $aArray[$j]
    Next
    $sStrOut &= '"' & $FileList[$i] & '" имеет отмененных чеков на сумму ' & ($iSum * -1) & @CRLF
	$iSum = 0
Next
FileWrite($sFindDir & '\' & $sFileOut, $sStrOut)
 
Автор
G

Glass4217

Чайник
Сообщения
53
Репутация
4
Ваш скрипт работает но выдает приличное количество странных записей, подозреваю в логах есть мусорные данные частично соответствующие шаблону регулярного выражения
upd. нашел в чем причина, если номер чека 56. то он тоже ловится регулярным выражением. и как следствие тоже проваливается в лог.

Код:
18.03.19;16:42:11;-215.00
19.03.19;09:03:39;-216.70
19.03.19;19:16:13;-58.30
20.03.19;11:34:51;-43.50
11;1;20.03.19
11;1;20.03.19
11;1;20.03.19
11;1;20.03.19
11;1;20.03.19
11;1;20.03.19
11;1;20.03.19
11;1;20.03.19
75;1;20.03.19
75;1;20.03.19
40;1;20.03.19
140;1;20.03.19
140;1;20.03.19
54;1;20.03.19
55;1;20.03.19
130;1;20.03.19
11;1;20.03.19
11;1;20.03.19
40;1;20.03.19
140;1;20.03.19
140;1;20.03.19
54;1;20.03.19
55;1;20.03.19
21.03.19;09:02:05;-53.70
21.03.19;09:15:57;-118.90


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

Ваш вариант к сожалению не выдает данных, создается пустой файл.
upd. если файл скрипта подсунуть в каталог то все вышло, прошу прощения.
Но выявился другой недостаток, он последний чек отмены за вчера помимо вчерашнего дня еще плюсует к "сегодня".
вот результат работы скрипта sngr
Код:
01.02.19;08:21:26;-37.10
01.02.19;21:32:05;-102.68
02.02.19;10:45:13;-243.20
03.02.19;17:07:27;-1018.89
04.02.19;10:30:52;-344.70
04.02.19;11:37:53;-65.30
04.02.19;16:18:12;-121.60
а вот xXx
Код:
"20190201.log" имеет отмененных чеков на сумму 139.78
"20190202.log" имеет отмененных чеков на сумму 382.98
"20190203.log" имеет отмененных чеков на сумму 1401.87
"20190204.log" имеет отмененных чеков на сумму 1933.47
"20190208.log" имеет отмененных чеков на сумму 6267.39
если одного лог файла маловато в архиве вложил 4 дня больше не влазит
 

Вложения

  • 189,9 КБ Просмотры: 2

InnI

AutoIT Гуру
Сообщения
4 162
Репутация
1 101
Вариант без регулярок с отдельными итогами и общей суммой
Код:
#include <File.au3>

$Folder = "D:\Test" ; путь к папке с логами

$Summa = 0
$aFiles = _FileListToArray($Folder, "*.log", 1)
If @error Then Exit MsgBox(0x40000, "Error", "Ошибка поиска файлов")
For $i = 1 To $aFiles[0]
  CheckLog($aFiles[$i])
Next
FileWriteLine($Folder & "\Summa.txt", "Итого отменено на сумму: " & StringFormat("%.2f", $Summa * -1))

Func CheckLog($FileName)
  If Not FileExists($Folder & "\" & $FileName) Then Return SetError(1, 0, 0)
  Local $Str = "", $Sum = 0, $aText, $aData
  $aText = FileReadToArray($Folder & "\" & $FileName)
  If Not IsArray($aText) Then Return SetError(2, 0, 0)
  For $i = 0 To UBound($aText) - 1
    $aData = StringSplit($aText[$i], ";")
    If $aData[0] <> 13 Then
      FileWriteLine($Folder & "\" & $FileName & ".txt", "Line " & $i + 1 & ": некорректный формат строки")
      ContinueLoop
    EndIf
    If $aData[4] = 56 Then
      $Str = "Line " & $i + 1 & ": " & $aData[2] & ";" & $aData[3] & ";" & $aData[12]
      FileWriteLine($Folder & "\" & $FileName & ".txt", $Str)
      $Sum += $aData[12]
    EndIf
  Next
  FileWriteLine($Folder & "\Summa.txt", $FileName & ": отмененных чеков на сумму " & StringFormat("%.2f", $Sum * -1))
  $Summa += $Sum
EndFunc
 
Автор
G

Glass4217

Чайник
Сообщения
53
Репутация
4
xXx сказал(а):
Спасибо, теперь работает без спутывания сумм. По какой-то причине я не могу заставить его работать из другого каталога кроме как из каталога с логами.



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

InnI сказал(а):
Вариант без регулярок с отдельными итогами и общей суммой
Это волшебно, сверх моих ожиданий. код работает а я даже примерно понять не могу как) спасибо что открываете мне новые грани знаний, я хоть одним пальцем прикоснулся к волшебству)

после выходных свежим взглядом посмотрел, я понял код)). очень изящное и интересное решение.
 
Верх