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

时间:2018-10-15 23:14:41

标签: powershell findstr

我正在尝试解决生产问题。我们每天(星期一至星期五)从银行收到包含错误记录的错误文件。这些记录的长度为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错误记录”和每个错误记录上方的关联记录,并将输出写入 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 :(得分:1)

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