我有两个CSV文件:
System,name,plan,run
A123,mev,28,12
B123,fsa,31,45
C345,ghd,52,34
System,name,plan,run
A123,mev,20,10
B123,fsa,32,43
C345,ghd,54,34
我希望能够找出两个文件共享哪些系统标识符,以及那些系统中“运行”测试数量之间的区别是什么。例如,File1
和File2
都具有系统C345
,它们的运行计数之差为零(两者都运行34)。
我的代码:
my @csv_file = qw| path/tofile1 path/tofile2 |;
opne $f, '<', $csv_file, or die;
foreach $csv_file ( @csv_file ) {
my %hash;
while ( my $line = <$f> ) {
my ($system, $name, $plan, $run) = split(",", $line);
$hash{$system} = [ $owner, $plan, $run ];
if ( $run > $plan ) {
print "More run than planned $system\n"; # prints B123
}
if ( $system eq $system ) {
print "Matching systems: $system\n"; # prints 'System, A123, B123, C345'
}
}
}
我已经能够打印出两个文件中都存在哪些系统,但是无法弄清楚如何使用这些重复系统并将它们的“运行”值相互比较。
答案 0 :(得分:1)
通常,对于这种情况,我建议使用DBD::CSV并将csv文件视为数据库表。但是需要一些不同的时间了:使用Tie::CSV_File使文件看起来像2D数组。如果您的操作系统的软件包管理器不提供该模块,请使用您最喜欢的CPAN客户端安装该模块。 (split
不够强大,无法进行通用CSV解析,CPAN上有很多更好的选择。)
#!/usr/bin/perl
use warnings;
use strict;
use feature qw/say/;
use Tie::CSV_File;
tie my @file1, "Tie::CSV_File", "file1.csv";
tie my @file2, "Tie::CSV_File", "file2.csv";
my %runs = map { $_->[0] => $_->[3] } @file1[1 .. $#file1];
for my $row (@file2[1 .. $#file2]) {
my $sys = $row->[0];
if (exists $runs{$sys}) {
my $diff = $runs{$sys} - $row->[3];
say "$sys run difference: $diff";
}
}
在您的示例输入中运行此操作可得出:
A123 run difference: 2
B123 run difference: 2
C345 run difference: 0
迭代第一个CSV文件,将System和run列存储为哈希表,然后迭代第二个CSV文件,在该哈希中查找第二个System并获取两个运行值的差。 / p>