我正在尝试解决生产问题。我们每天(星期一至星期五)从银行收到包含错误记录的错误文件。这些记录的长度为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上执行。
有人能帮助我创建一个脚本来完成将输入文件转换为所需输出文件的处理吗?
非常感谢您的帮助。
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
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
答案 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"