前提・実現したいこと
perlで2つのファイルのマッチング処理について何か方法があればご教授くださいませ。
下記のようなカンマ区切りの2ファイルがあり、双方のファイルの3列目(code2)と4列目(code3)を結合して比較し、存在すれば、2つ目のファイルの末尾に、1つ目のファイルの5列目と6列目の情報を付与したいと考えてます。マッチする際のキーが完全一致の場合は処理できたのですが、前方一致でもマッチしたものとした場合、どのように処理をすればいいのか解らずご質問させていただきました。どうぞよろしくお願い致します。
1つ目のtextファイル(連番,code1,code2,code3,flg1,flg2)
0000001,0640941,01101001001,1-1,A,M
0000002,0640941,01101001001,1-6,T,M
0000003,0640941,01101001001,1-8,w,M
.
.
.
2つ目のtextファイル(連番,code1,code2,code3)
0103300001,0640941,01101001001,1-1
0103300002,0640941,01101001001,1-6-20
0103300003,0640941,01101001002,1-8-10
.
.
.
結果ファイル
0103300001,0640941,01101001001,1-1,A,M ##マッチしたので情報を付与
0103300002,0640941,01101001001,1-6-20,T,M ##マッチしたので情報を付与
0103300003,0640941,01101001002,1-8-10, ##アンマッチ
.
.
.
該当のソースコード
perl
1sub match_test { 2 3 my %match = (); 4 5 my $in_file = 'C:/work/data1.txt'; 6 open IN, "<:encoding(cp932)", "$in_file" or die "!$\n"; 7 8 my $outfile = 'C:/work/value.txt'; 9 open OUT, ">:encoding(cp932)", "$outfile" or die "!$\n"; 10 11 while (<IN>){ 12 chomp; 13 my @arr = split(/,/,$_,-1); 14 my $key1 = $arr[2] . $arr[3]; 15 $match{$key1} = [$arr[4],$arr[5]]; 16 } 17 close(IN); 18 19 my $in_file2 = 'C:/work/data2.txt'; 20 open IN2, "<:encoding(cp932)", "$in_file2" or die "!$\n"; 21 22 while (<IN2>){ 23 24 chomp; 25 my @arr = split(/,/,$_,-1); 26 my $key2 = $arr[2] . $arr[3]; 27 28 my $m_data = $match{$key2}; 29 my $a1 = $m_data->[0]; 30 my $a2 = $m_data->[1]; 31 32 if (exists($match{$key2})){ 33 print OUT join(',',@arr,$a1,$a2) . "\n"; 34 }else{ 35 next; 36 } 37 38 } 39 close (IN2); 40} 41
補足情報(FW/ツールのバージョンなど)
windows7proにて操作しております。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/29 10:00