现在我正在尝试同步按日期列出的两个数据文件,以便稍后进行比较。但是我似乎无法打印出日期匹配的行。此时我已将每个文件的数据分成2个数组。我只需找到两个数组中的日期并打印出来。任何建议都会非常感激。
以下是我正在使用的原始数据的示例集,每个文件的格式相同:
09/11/2009,00:56:00,51.602,47.894,87,88,0,1032 09/12/2009,00:56:00,57.794,55.796,93,54,0,1023.6 09/13/2009,00:56:00,64.292,62.204,93,66,0,1014.4 09/14/2009,00:56:00,61.592,55.4,80,25,0,1009.6 09/15/2009,00:56:00,58.604,53.798,84,31,0,1009.1 09/16/2009,00:56:00,53.6,48.902,84,45,0,1017
我已将日期拆分为每个文件的数组。我的最终目标是只打印两个文件都有数据的代码行。所以为了做到这一点,我想比较2个数组和元素是日期。
我的初始代码如下所示:
foreach $bdate(@bdate){
while (<PL>){
chomp;
@arr = split (/,/);
$pday=$arr[1];
push @pdate, $pday;
if ($bdate eq $pdate){
print "$bdate,$pday\n";
}
}
答案 0 :(得分:4)
一种方式(很多)将遍历每个数组,构建一个哈希,如下所示;
for (@array1, @array2) {
$dates{$_}++;
}
然后您可以打印对应于2或更多值的键;
print $_,"\n" for grep {$dates{$_} > 1} keys %dates;
(未经测试,写在没有perl的机器上)
...快速CPAN搜索结果显示List::Compare,此示例为
$lc = List::Compare->new(\@Llist, \@Rlist);
@intersection = $lc->get_intersection;
答案 1 :(得分:1)
以下是perlfaq4的示例(简化了一点):
my (@intersection, %count);
for my $element (@array1, @array2) { $count{$element}++ }
for my $element (keys %count) {
push @intersection, $element if $count{$element} > 1;
}
更多惯用版:
my (%union, %isect);
for my $e (@array1, @array2) { $union{$e}++ && $isect{$e}++ }
my @intersection = keys %isect;
两种方法都假设每个元素在给定数组中都是唯一的。
答案 2 :(得分:0)
您是否反对使用外部Unix函数“comm”?