3

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

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
4

1 回答 1

4

当 perl 看到这条线时

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

它将这解释为从列表($le, $date, $company)到列表的列表分配($hash{$key}),它将第一个列表中的每个项目分配给第二个列表中的匹配项目,并丢弃没有匹配项目的任何项目。您想要做的是将包含值的数组引用分配给哈希键,如下所示

$hash{$key} = [$le, $date, $company];
于 2013-05-21T20:37:11.110 回答