- ベストアンサー
perlによるファイル内容検出方法について
- Perlを使ったファイル内容の検出方法を教えてください
- 初心者向けに、大量のデータ処理に効率的なPerlプログラムを紹介してください
- ファイル(1)とファイル(2)の内容を比較して、一致するリストを出力する方法を教えてください
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
この例だけで単純に考えれば 2列目をキーにして出力していけばよいだけみたいだし、 先頭は時間ぽい? ということは固定長扱いに出来そうですね。 ということで、2列目だけの連想配列作ってキーがあるか無いかで 判断するのはどうでしょう? 数百万程度なら20分もあれば終わりそうだけど。。。 #実装はイメージです(笑 my %PK = (); open($FILE_1, '<') || die; while( <$FILE_1> ){ $PK{ substr($_,8,13) } = 1; } close($FILE_1); open($FILE_2,'<') || die; open(OUT, '>OUTPUT_FILE'); while( ($line = <$FILE_2>) ) { print OUT $line if( exists($PK{ substr($line,0,13) }) ); } close(OUT); close($FILE_2); オンメモリーで処理していくのでそれなりのメモリは使うかもしれません。 ちなみに、UNIXならjoinというコマンドもあります。
その他の回答 (3)
- kmee
- ベストアンサー率55% (1857/3366)
これだけ大きなデータを効率よく操作するなら、データベースにしてしまうのがいい気がします。
- hyter
- ベストアンサー率73% (31/42)
サンプルを作った後に、質問文の中に「効率のよいプログラムを」と 書いてあったのに気づきました……。 効率はあまり考えてないですが、何かのヒントになれば。 ========================= #!/usr/bin/perl use strict; use warnings; my $file1_path = "./file1.txt"; my $file2_path = "./file2.txt"; my $output_path = "./output.txt"; my @file1_data = (); my @file2_data = (); my @output_data = (); my @buff = (); #+-- file1の内容を取得 --+# open F1, "< $file1_path"; @file1_data = <F1>; close F1; #+-- file2の内容を取得 --+# open F2, "< $file2_path"; @file2_data = <F2>; close F2; #+-- 比較 --+# for ( my $i = 0; $i <= $#file2_data; $i++ ) { # 改行コードを削除 $file2_data[$i] =~ s/\n//g; # TABで分割 @buff = split( "\t", $file2_data[$i] ); # grepでマッチするものがあるかどうか確認 if ( grep ( /^..:..:..\t$buff[0]\t.*$buff[1].*\t.*$/, @file1_data ) ) { # マッチするものを確保 push @output_data, $file2_data[$i]; } } #+-- 出力 --+# open OUT, "> $output_path"; for ( my $j = 0; $j <= $#output_data; $j++ ) { print OUT $output_data[$j], "\n"; } close OUT; exit; =========================
お礼
grepでの対応は自分でも試みているのですが、どうもすごい時間がかかり、処理結果はなかなかでてこないのです。 perl初心者のため、基本的なプログラムもまともにかけないので、参考にさせていただきます。 ありがとうございました。
- Tacosan
- ベストアンサー率23% (3656/15482)
^ は何を意味するのでしょうか? そして, 「ファイル(2)の内容がファイル(1)にある」とはどういう時を指すのでしょうか? しかし, 「百万行」とか「数千万行」とかの巨大なファイルを扱うのもすごいけど, そんなファイルを作るのもすごいなぁ....
お礼
ファイル内容に ',%等 DB格納時にエラーとなるものが多数入っているため、ファイルでの処理をしたいと思っております。 また、ファイルが今後も増えていくことがあり、できれば基本プログラムを作っておきたいと考えております。 アドバイスいただき、ありがとうございます。