如何创建 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"
我正在尝试解决生产问题。我们每天(周一至周五)从银行收到包含错误记录的错误文件。这些记录的长度为 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"