Исключая строки, которые не содержат одну или несколько строк из текстового файла - PullRequest
0 голосов
/ 25 марта 2019

У меня есть несколько файлов журнала сервера.Всего они содержат около 500 000 строк текста журнала.Я только хочу сохранить строки, которые содержат «Загруженные» и «Журнал».Строки, которые я хочу исключить, фокусируются на журналах ошибок и основных системных операциях, таких как «запуск клиента», «перезапуск клиента» и т. Д.

Вот пример строк, которые мы ищем:

[22:29:05]: Downloaded 39 /SYSTEM/SAP logs from System-4, customer (000;838) from 21:28:51,705 to 21:29:04,671

Строки, которые должны быть сохранены, должны быть дополнены строкой даты, которая является частью имени файла журнала.($ date)

Далее, поскольку полученные журналы довольно неструктурированы, отфильтрованные файлы должны быть преобразованы в один csv-файл (столбцы: отметка времени, загрузка журналов, системный каталог, тип системы, клиент, время запуска,время окончания, дата [будет добавлено к каждой строке из имени файла]. Операция замены, превращающая интервалы в запятую, является лишь первой попыткой внести некоторую структуру в данные. Этот файл должен быть загружен в программу панели инструментов python.

В настоящий момент предварительная обработка 3 Txt-файлов занимает 2,5 минуты, а цель - максимум 5-10 секунд, если это возможно.

Большое спасибо за вашу поддержку, поскольку я борюсь с этим с понедельника на прошлой неделе. Может быть, PowerShell - не лучший способ? Я открыт для любой помощи!

В данный момент я запускаю этот сценарий PowerShell:

$files = Get-ChildItem "C:\Users\AnonUser\RestLogs\*" -Include *.log

New-Item C:\Users\AnonUser\RestLogs\CleanedLogs.txt -ItemType file

foreach ($f in $files){

    $date = $f.BaseName.Substring(22,8)
    (Get-Content $f) | Where-Object { ($_ -match 'Downloaded' -and $_ -match 'SAP')} | ForEach-Object {$_ -replace " ", ","}{$_+ ','+ $date} | Add-Content CleanedLogs.txt
}

1 Ответ

1 голос
/ 25 марта 2019

Это самое быстрое, что я мог сделать. Я не тестировал, используя -split против -replace или специальные методы .NET:

$files = Get-ChildItem "C:\Users\AnonUser\RestLogs\*" -Include *.log

New-Item C:\Users\AnonUser\RestLogs\CleanedLogs.txt -ItemType file

foreach ($f in $files) {

    $date = $f.BaseName.Substring(22,8)
    (((Get-Content $f) -match "Downloaded.*?SAP") -replace " ",",") -replace "$","$date" | add-content CleanedLogs.txt

}

Как правило, скорость достигается за счет удаления петель и Where-Object «фильтрации».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...