如何比较哈希表的两列

时间:2018-09-20 01:58:57

标签: perl hash

我有两个CSV文件:

文件1

System,name,plan,run
A123,mev,28,12
B123,fsa,31,45
C345,ghd,52,34

文件2

System,name,plan,run
A123,mev,20,10
B123,fsa,32,43
C345,ghd,54,34

我希望能够找出两个文件共享哪些系统标识符,以及那些系统中“运行”测试数量之间的区别是什么。例如,File1File2都具有系统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'
        }
    }
}

我已经能够打印出两个文件中都存在哪些系统,但是无法弄清楚如何使用这些重复系统并将它们的“运行”值相互比较。

1 个答案:

答案 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>