Perl:比较两个复杂的哈希值

时间:2013-04-03 01:05:02

标签: perl hash

我不是Perl的新手,但我只是用它来进行简单的数据搜索和操作。比较两个不同文件中的多个值对我来说绝对令人费解。

我有两个包含数千个CSV文件,可能包含数百行逗号分隔记录。每一行都是一个股票市场符号,然后是下面样本数据第4列中时间戳指示的各种“滴答”数据:

ESM3,2341297,T,14:13:41.919000,SELL,1550.000000,1,0,1786778,,U
ESM3,2341297,T,14:13:41.919000,SELL,1550.000000,2,0,1786780,,U
ESM3,2341297,Q,14:13:41.919000,Q,WIDE,1550.000000,551,1550.250000,831,0.000000,0.000000,0.000000,139,75,N,CME,CME
ESM3,2341298,T,14:13:41.920000,SELL,1550.000000,1,0,1786781,,U
ESM3,2341298,Q,14:13:41.920000,Q,WIDE,1550.000000,550,1550.250000,831,0.000000,0.000000,0.000000,139,75,N,CME,CME
ESM3,2341299,Q,14:13:41.920000,Q,WIDE,1550.000000,547,1550.250000,831,0.000000,0.000000,0.000000,138,75,N,CME,CME
ESM3,2341300,T,14:13:41.921000,SELL,1550.000000,1,0,1786782,,U
ESM3,2341300,Q,14:13:41.921000,Q,WIDE,1550.000000,546,1550.250000,830,0.000000,0.000000,0.000000,137,74,N,CME,CME
ESM3,2341301,Q,14:13:41.931000,Q,WIDE,1550.000000,546,1550.250000,832,0.000000,0.000000,0.000000,137,75,N,CME,CME
ESM3,2341302,Q,14:13:41.934000,Q,WIDE,1550.000000,541,1550.250000,832,0.000000,0.000000,0.000000,135,75,N,CME,CME
ESM3,2341303,Q,14:13:41.934000,Q,WIDE,1550.000000,541,1550.250000,834,0.000000,0.000000,0.000000,135,76,N,CME,CME

我想创建一个脚本,我几乎每天都会用它来逐行比较每个文件。例如如果FILE1,FIELD3匹配FILE2,FIELD3,则继续处理。如果没有,做一些事情。同样重要的是输出采用简单且易于管理的格式,类似于上面的示例数据(即:CSV格式),以便我可以将其导入Excel或网页。这几乎排除了我在其他例子中看到的一些模块。

我已经将这两个文件都导入了自己的哈希值。我只是没有想到比较两个文件中每个键的多个值所需的语法。有人可以帮忙吗?

由于

open(DATA01, '<', $inFile01) or die("Can't open input file \"$inFile01\": $!\n");

my %hash01;
my $count01 = 0; # start the incrementer
while (my $line = <DATA01>) {
$line =~ s/\s*\z//;
my @tokens = split /,/, $line;
my $symbol = shift @tokens; #reference the tokens array (contains all)
my $qsymbol01 =          "$symbol-$count01";
   $hash01{seqNum} =     $tokens[0];
   $hash01{type} =       $tokens[1];
   $hash01{timeStamp} =  $tokens[2];
   $hash01{status} =     $tokens[4];
   $hash01{bid} =        $tokens[5];
   $hash01{bidVol} =     $tokens[6];
   $hash01{ask} =        $tokens[7];
   $hash01{askVol} =     $tokens[8];
   $hash01{$qsymbol01} = \@tokens;

$count01 ++;
}


open(DATA02, '<', $inFile02) or die("Can't open input file \"$inFile02\": $!\n");

my %hash02;
my $count02 = 0;
while (my $line02 = <DATA02>) {
$line02 =~ s/\s*\z//;
my @tokens02 = split /,/, $line02;
my $symbol02 = shift @tokens02;
my $qsymbol02 =          "$symbol02-$count02";
   $hash02{seqNum} =     $tokens02[0];
   $hash02{type} =       $tokens02[1];
   $hash02{timeStamp} =  $tokens02[2];
   $hash02{status} =     $tokens02[4];
   $hash02{bid} =        $tokens02[5];
   $hash02{bidVol} =     $tokens02[6];
   $hash02{ask} =        $tokens02[7];
   $hash02{askVol} =     $tokens02[8];
   $hash02{$qsymbol02} =         \@tokens02;

$count02 ++;
}

0 个答案:

没有答案