質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

解決済

2回答

4475閲覧

perlで2つのファイルのマッチング処理について

-JIJI-

総合スコア13

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

0グッド

0クリップ

投稿2019/01/29 08:22

前提・実現したいこと

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にて操作しております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

正規表現で%matchのkeyに対してマッチングしてgrepでフィルタリング。引っかかったものがあるか否かで判定。

以下、grepの使用例です。

use strict; use warnings; my %x = ('abc'=>1, 'acb'=>2, 'ba'=>3, 'ca'=>4); foreach my $testkey ('a', 'b', 'c', 'x'){ my @res = grep {/^$testkey/} keys %x; print "Tested key: $testkey\n"; if(scalar @res > 0){ print " matched: @res\n"; }else{ print " None matched\n"; } }

投稿2019/01/29 09:13

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

-JIJI-

2019/01/29 10:00

早々のご返信ありがとうございます。まだまだ勉強不足を実感しております。非常に勉強になりました。ご質問させていただきました内容は、処理中ではありますが、無事解決いたしました。grepを使用した処理もあわせて処理完了後に試してみます。今後ともどうぞよろしくお願い致します。
guest

0

ベストアンサー

力技ですがこんな感じ?

Perl

1while (<IN2>){ 2 3 chomp; 4 my @arr = split(/,/,$_,-1); 5 my $key2 = $arr[2] . $arr[3]; 6 7 for my $i (keys %match) { 8 if (index($key2, $i) == 0) { 9 my $m_data = $match{$i}; 10 my $a1 = $m_data->[0]; 11 my $a2 = $m_data->[1]; 12 print OUT join(',',@arr,$a1,$a2) . "\n"; 13 last; 14 } 15 } 16 17 } 18 close (IN2);

投稿2019/01/29 09:06

ssasaki

総合スコア1167

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

-JIJI-

2019/01/29 09:56

早々のご返信ありがとうございます。早速現在処理を実行中で、途中経過ですが、思ったとおりの処理が実行されておりました。まだまだ勉強不足を実感しております。非常に勉強になりました。ご返信もはやく、思い通りの処理が実行できましたので、ベストアンサーとさせていただきます。今後ともよろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問