如何创建 Windows 服务器脚本以从文件中删除错误记录,以及每个记录的先前记录,并将结果写入新文件

How do I create a Windows Server script to remove error records, AND the previous record to each, from a file with the results written to a NEW file

我正在尝试解决生产问题。我们每天(周一至周五)从银行收到包含错误记录的错误文件。这些记录的长度为 94 个字节。有时,文件中会出现一些错误代码,当由该州的系统处理时会导致一些重大问题。

我被要求从发送给国家的文件中“过滤掉”错误记录。为此,我创建了一个单行 FINDSTR 命令(如下)以在记录的位置 4-6 中找到包含错误代码“R02”(无引号)的记录,并将其删除。

      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 错误记录和每条错误记录上方的关联记录,并将输出写入新文件,保留原始文件原封不动——因为它由我们的用户部门保留在本地。

下面是 INPUT 记录内容的样子(错误代码以粗体显示),并预先添加了记录编号以供参考。抱歉,由于安全问题,我无法提供完整的 94 字节记录图像。在此之下,是我想要的输出文件的样子。

我不知道这是否可以用 FindStr 完成,但我确信 PowerShell 可以完成这项工作,但我对 PowerShell 一无所知。该脚本将在 Windows 服务器上执行。

谁能帮我创建一个脚本来完成将输入文件转换为所需输出文件的处理过程?

非常感谢您的协助。

****** 示例数据 ******

输入文件

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
           

以下 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"