我需要使用下面的示例waiver.csv
构建一个用于工作目的的豁免系统。阶段错误已打印在错误文件中(请参阅下文input.txt
)。我需要检查input.txt
上的每一行错误与waiver.csv
(具有匹配的阶段,过程和块),并附带以下示例输出。我需要有关将错误文件中的错误与waiver.csv
文件中的错误进行匹配的帮助。waiver.csv
:
#process,#Block,#Stage name,#Waiver owner,#Justification,#Error msg
process1,block1,stage1,Alex,testing,Error: Port 0 does not exist
process1,block1,stage1,Alex,testing,Error: Port 1 does not exist
process1,block1,stage1,Alex,testing,Error: Port a0 does not exist
字符串
错误文件(input.txt
):
Stage: stage1
Process: process1
Block: block1
Error: Port 0 does not exist
Error: Port 1 does not exist
Error: Port a0 does not exist
Error: Port a1 does not exist
Error: Port b3 does not exist
Error: Nothing matched for port_list (SEL-005)
Error: Nothing matched for port_list (SEL-005)
Error: Port c5 does not exist
Error: Nothing matched for port_list (SEL-005)
Error: Nothing matched for port_list (SEL-005)
型
预期输出文件:
WAIVED (3 waiver, 0 errors) - stage1,process1,block1:
Error: Port 0 does not exist
Error: Port 1 does not exist
Error: Port a0 does not exist
Waiver Owner: Alex
Justification: testing
FAILED (No waiver, 4 errors) - stage1,process1,block1:
Error: Nothing matched for port_list (SEL-005)
Error: Port a1 does not exist
Error: Port b3 does not exist
Error: Port c5 does not exist
型
下面是我正在编写的代码:
#!/usr/bin/perl
use strict;
use warnings;
use Text::CSV;
# Define the file paths
my $input_file = 'input.txt';
my $waiver_file = 'waiver.csv';
# Read the waiver.csv file
my @waiver_msgs;
my $csv = Text::CSV->new({ binary => 1 }) or die "Cannot use CSV: " . Text::CSV->error_diag();
open(my $waiver_fh, '<', $waiver_file) or die "Cannot open $waiver_file: $!";
while (my $row = $csv->getline($waiver_fh)) {
push @waiver_msgs, $row->[5]; # Assuming error messages are in the 6th column (index 5)
}
close($waiver_fh);
# Read the input.txt file
open(my $input_fh, '<', $input_file) or die "Cannot open $input_file: $!";
while (my $line = <$input_fh>) {
chomp $line;
if ($line =~ /^Error: (.+)$/) {
my $error_msg = $1;
print "$error_msg\n";
if (grep { $_ eq $error_msg } @waiver_msgs) {
print "Error message '$error_msg' is waived.\n";
} else {
print "Error message '$error_msg' is not waived.\n";
}
}
}
close($input_fh);
型
2条答案
按热度按时间lkaoscv71#
问题是您解析两个输入文件的方式不同。在读取豁免文件时,将保留
Error:
前缀。但是,在读入错误文件时,不会保留Error:
前缀。这就是你的比较失败的原因。根据所需的输出,您希望保留
Error:
。既然是这种情况,您应该更改捕获括号以包含它。变更:字符串
收件人:
型
或者,由于要捕获整行,因此不需要捕获括号。您可以简化正则表达式,仅在行首搜索错误字符串,然后将错误消息设置为整行:
型
zfycwa2u2#
谢谢你的询问-这是一个有趣的问题。
我不知道为什么我想到了一个数据库,其中有一个用于查找的“放弃”表和一个用于处理输入数据的正则表达式,但这就是我的想法。所以你去:
字符串
我修改了您的输入数据,以便在有效段之间包含一些虚假信息,这就是为什么您会发现“解析失败”消息的原因。修改后的输入对应的输出如下所示:
型
再次感谢!