Как создать сценарий Windows Server для удаления записей об ошибках и предыдущей записи для каждого из файла с результатами, записанными в НОВЫЙ файл - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь решить производственную проблему.Мы ежедневно получаем файл ошибок (пн-пт) из банка, который содержит записи об ошибках.Эти записи имеют длину 94 байта.Иногда в файле будут присутствовать некоторые коды ошибок, которые вызывают некоторые серьезные проблемы при обработке системой в государстве.

Меня попросили «отфильтровать» записи ошибок из файла, который отправляется вГосударственный.Для этого я создал однострочную команду FINDSTR (ниже), чтобы найти записи, содержащие код ошибки «R02» (без кавычек), в позициях 4–6 записей и удалить их.

      FindStr /V "R02" INPUT_FILE > OUTPUT_FILTERED_FILE_%DATE%_%TIME%

Это сработало, как я и надеялся, и запрашивающие пользователи были счастливы, НО один из менеджеров обнаружил, что запись, непосредственно предшествующая записи, содержащей код ошибки, ТАКЖЕ ДОЛЖНА БЫТЬ УДАЛЕНА из файла, поскольку она связана с записью, содержащей код ошибки.Проблема в том, что эта предыдущая запись НЕ содержит код ошибки.В позициях 89-94 есть 6-значное число, которое может быть связано с записью ошибки, но я не хочу угадывать или слишком усложнять сценарий.

Как видно из данных примера (ниже), существует 5 записей ошибок (5, 7, 9, 11 и 27), содержащих код ошибки «R02». Моя команда FindStr работала для удаленияR02 записывает и создает выходной файл без каких-либо записей об ошибках (содержащих «R02»).

ЧТО МНЕ НУЖНО СЕЙЧАС, чтобы иметь возможность удалить «связанные записи», которые идут с записями R02 в примереданные ниже.Если все сделано правильно, следующие записи будут удалены из файла примера в одном процессе: 4, 5, 6, 7, 8, 9, 10, 11, 26 и 27.

Мне нужно удалить оба«Записи ошибок R02 И соответствующая запись над каждой из этих записей ошибок одновременно, и записать вывод в NEW файл , оставив исходный файл без изменений, как есть - потому что он хранится локально нашим отделом пользователей.

Ниже показано, как выглядит содержимое записи INPUT (коды ошибок выделены жирным шрифтом) с номером записи, предварительно добавленным для справочных целей.Извините, но я не могу предоставить полные 94-байтовые записи из-за проблем безопасности.Ниже показано, как должен выглядеть мой желаемый выходной файл.

Я не знаю, можно ли это сделать с FindStr, но я уверен, что PowerShell справится с этой задачей, НО я ничего не знаю о PowerShell.Сценарий будет выполняться на Windows Server.

Может кто-нибудь помочь мне с созданием сценария, который будет выполнять обработку для преобразования входного файла в нужный выходной файл?

Большое спасибо за помощь.

****** Пример данных ******

Входной файл

Nbr- - Содержимое записи - -

01    HEADER RECORD                    
02    CONTROL RECORD                   
03    5200SAN                          
04    62112200                         
05    799**R02**12                         
06    62112200                         
07    799**R02**12                         
08    62112200                         
09    799**R02**12                         
10    62112200                         
11    799**R02**12                         
12    82000000                         
13    5200SAN                          
14    62112200                         
15    798C0312                         
16    62112200                         
17    798C0312                         
18    62112200                         
19    798C0312                         
20    62112200                         
21    798C0312                         
22    62112200                         
23    798C0312                         
24    82000000                         
25    5200SAN                          
26    62112200                         
27    799**R02**12                         
28    TRAILER RECORD                   

Требуемый новый выходной файл

Nbr - - Содержимое записи - -

 01    HEADER RECORD                
 02    CONTROL RECORD               
 03    5200SAN                      
       #  DELETED  #                
       #  DELETED  #                
       #  DELETED  #                
       #  DELETED  #                
       #  DELETED  #                
       #  DELETED  #                
       #  DELETED  #                
       #  DELETED  #                
 12    82000000                     
 13    5200SAN                      
 14    62112200                     
 15    798C0312                     
 16    62112200                     
 17    798C0312                     
 18    62112200                     
 19    798C0312                     
 20    62112200                     
 21    798C0312                     
 22    62112200                     
 23    798C0312                     
 24    82000000                     
 25    5200SAN                      
       #  DELETED  #                
       #  DELETED  #                
 28    TRAILER RECORD

1 Ответ

0 голосов
/ 16 октября 2018

Следующая версия Powershell не проверена, но в основном должна выполнять то, что вы просите.В моей логике вполне могут быть ошибки, но это даст базовую структуру того, что должно произойти.

[cmdletbinding()]
Param
(
    [string] $InputFilePath
)

# Read the text file
$InputFile = Get-Content $InputFilePath

# Get the time
$Time = Get-Date -Format "yyyyMMdd_hhmmss"

# Set up the output file name
$OutputFileFiltered = "Output_Filtered_File_$Time.txt"

# Initialize the variable used to hold the output
$OutputStrings = @()

# Loop through each line in the file
# Check the line ahead for "R02" and add it to the output
# or skip it appropriately    
for ($i = 0; $i -lt $InputFile.Length - 1; $i++)
{
    if ($InputFile[$i + 1] -notmatch "R02")
    {
        # The next record does not contain "R02", add it to the output 
        $OutputStrings += $InputFile[$i]
    }
    else
    {
        # The next record does contain "R02", skip it
        $i++
    }
}

# Add the trailer record to the output
$OutputString += $InputFile[$InputFile.Length - 1]

# Write the output to a file
$OutputStrings | Out-File $OutputFileFiltered

Сохраните это как FilterScript.ps1 (или что вы предпочитаете) и выполните его в Powershell с помощьюследующее:

FilterScript.ps1 -InputFilePath "C:\Path\To\Your\InputFile.txt"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...