如何将2个文件与4列组合成perl中的哈希值

时间:2013-05-21 20:31:34

标签: perl

我正在尝试将包含4列和多行的文件加载到哈希中,我需要将第1个字段与包含字母数字数据并与日期匹配的另一个文件合并。这是我的数据示例:< / p>

file 1:
AOKX 495408, L,  04/02/13, SWCOMP
AOKX 495408, L,  04/20/13, SWCOMP
BLHX    102, L,  04/01/13, WILDCOM
CRDX   7067, L,  04/05/13, TYCO
WW     9030, L,  04/02/13, HALLI

file2:
AOKX 495408, L,  04/15/13, SWCOMP
BLHX    102, L,  04/03/13, WILDCOM
CRDX   7067, L,  04/20/13, TYCO
WW     9030, L,  04/30/13, HALLI
BLHX    102, L,  04/30/13, WILDCOM

output file needs to look like:
AOKX 495408 L  04/02/13 04/15/13 SWCOMP
BLHX    102 L  04/02/13 04/03/13 WILDCOM (more than 1 date exists 04/30/13)

这是我到目前为止 - 它完全不起作用 - 在测试时,想要打印$ key中的内容,它给了我第二个字段。我似乎无法使用更多的2个字段。所以我被困在这里

my %hash;

open FILE1, "<", "out1.txt" or die "$!\n";

while ( <FILE1> ) {
chomp $_;
my ( $key, $le, $date, $company ) = split ',', $_;
$hash{$key} = $le, $date, $company;
    push @{ $hash{$key} }, $_;
}

close FILE1;

我将格式更改为[$ le,$ date,$ company]非常感谢。我的下一个问题是,一旦读入哈希值,我无法弄清楚如何将两个文件中的数据组合在一起。我需要能够将第一个字段(车号)与两个文件中的日期相匹配。我自己的文件有多个日期列表。如果没有日期,它仍然会被写出来。如果我真的需要多个日期来匹配彼此最接近的日期。 (例如04/01/2013 04/05/2013然后04/06/2013 04/30/2013)我希望这是有道理的。

所以这就是我到目前为止(非常基本只是想弄清楚每一步)任何帮助都非常感激,因为我只是在学习并且真的需要让这项工作...... thx

#!/usr/bin/perl
# 
use strict;
use warnings;

my $cnt = 0;
open FILE1, "<", "out1.txt" or die "$!\n";

my %hash;

 while ( <FILE1> ) {
     chomp $_;
     my ( $key, $le, $date, $company ) = split ',', $_;
     $hash{$key} = [$le, $date, $company];
     push @{ $hash{$key} }, $_;
     $cnt++;
#    print "$key $date\n"; 
 }

 print "total pcon records processed: $cnt\n";  #just to verify all records read
 $cnt=0;

 close FILE1;

 open FILE2, "<", "out2.txt" or die "$!\n";
 open OUTFILE, ">", "final.txt" or die "$!\n";

 while (<FILE2>) {
     my ( $rkey, $rle, $rdate, $rcompany ) = split ',', $_;
     $hash{$rkey} = [$rle, $rdate, $rcompany];
     push @{ $hash{$rkey} }, $_;
     $cnt++;
 #   print OUTFILE "\n"; #to write out once figure out how to combine

 }
 print "total rcpl records processed: $cnt\n";  #just to verify all records read

 close FILE2;
 close OUTFILE;

需要输出看起来像:

 AOKX 495408 L  04/02/13 04/15/2013 SWCOMP 
 AOKX 495408 L  04/20/13            SWCOMP
 BLHX    102 L  04/01/13 04/03/2013 WILDCOM
 BLHX    102 L           04/30/2013 WILDCOM

1 个答案:

答案 0 :(得分:4)

当perl看到该行

$hash{$key} = $le, $date, $company;

它将此解释为从列表($le, $date, $company)到列表($hash{$key})的列表分配,列表$hash{$key} = [$le, $date, $company]; 将第一个列表中的每个项目分配给第二个列表中的匹配项目,并抛弃任何没有匹配的项目项目。您要做的是将包含值的数组引用分配给散列键,如此

{{1}}