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番目のフィールドを与えています. これを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] に変更しました。どうもありがとうございました。私の次の問題は、2 つのファイルがハッシュに読み取られた後、データを結合する方法がわからないことです。最初のフィールド (車の番号) を両方のファイルの日付と一致させる必要があります。どちらのファイルにも日付の複数のリストがあります。日付が存在しない場合でも、書き出されます。複数の日付の場合、最も近い日付を互いに一致させる必要があります。(例: 2013 年 4 月 1 日 2013 年 4 月 5 日 2013 年 4 月 6 日 2013 年 4 月 30 日) これが理にかなっていることを願っています。

だからここに私がこれまでに持っているものがあります(各ステップを理解しようとする非常に基本的なものです)私はちょうど学んでいて、本当にこれを機能させる必要があるので、どんな助けも大歓迎です... 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;

これは、最初のリストの各項目を 2 番目のリストの一致する項目に割り当て、一致する項目のない項目を破棄する、リストからリスト($le, $date, $company)へのリスト割り当てとして解釈されます。($hash{$key})あなたがしたいことは、値を含む配列参照を次のようにハッシュキーに割り当てることです

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