- ベストアンサー
perlプログラム 外部複数ファイルの読み込み処理について
- perlプログラムを使用して外部複数ファイルの読み込み処理を行いたい場合、どのように実装すればよいのでしょうか?31個のファイルがあるフォルダから一つずつファイルを読み込み、別のリストに含まれる値が各ファイルの何行目に含まれているかを出力するPerlプログラムを作成したいです。
- Perlプログラムを使用して外部の複数のファイルを読み込む方法について教えてください。31個のファイルがあるフォルダに格納されており、別のファイルには一意な値が格納されています。この一意な値が各ファイルの何行目に存在するかを出力するPerlプログラムを作成したいです。
- 外部の複数のファイルをPerlプログラムで読み込む方法について教えてください。31個のファイルがあり、別のファイルには一意な値が含まれています。これらの一意な値が各ファイルのどの行にあるかを出力するPerlプログラムを作成したいです。どのように実装すればよいのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
サンプルプログラムを作成してみたので試してみてください。 テストしていないのでうまく行かないことがあるかも知れません。 use strict; open FH, "list.txt" or die "Can't open list.txt: $!"; my @keyword = <FH>; chomp @keyword; close FH; my ($day, @result) = ('00'); while (++$day lt '32') { my $file = "T0001_05_$day"; open FH, $file or die "Can't open $file: $!"; while (my $line = <FH>) { foreach my $i (0 .. $#keyword) { if ($line =~ /$keyword[$i]/) { push @result, [$i, "$day", $., "$file ${.}行目 $line"]; last; } } } close FH; } @result = map { $_->[3] } sort { $a->[0] <=> $b->[0] || $a->[1] cmp $b->[1] || $a->[2] <=> $b->[2] } @result; open OUT, ">out.txt" or die "Can't open out.txt: $!"; print OUT @result; close OUT;
その他の回答 (2)
- JaneDue
- ベストアンサー率75% (263/350)
まだ解決しませんか? もしLinux なら grepの方が楽かも。(windowsでは不可です) 以下を データT0001_05~ファイルとlist.txtと同じ場所において パーミションを705にして実行してください。 ------------------------------------- ○○.cgi #!/usr/bin/perl $| = 1; print "Content-type: text/html\n\n"; @files = glob("T0001_05_*"); open(IN,"list.txt");@keys=<IN>;close(IN); chomp @keys; foreach(@keys){ print "<b>$_</b><br>\n"; @result = `grep -n "$_" @files`; foreach(@result){ split(/:/,$_,3); print "@_[0] @_[1]行目 @_[2]<br>\n"; } print "<hr>\n"; } exit; -------------------------------------- htmlで出してます。適宜ブラウザ上でコピーしてください。
お礼
ボリュームが多く何百万行もあるため、grep実行はすでに試みたのですが、処理時間がかかってしまいました。プログラム初心者のため このプログラム内容は今後の参考にさせていただきます。ありがとうございます。
- ORUKA1951
- ベストアンサー率45% (5062/11036)
まず、それらのファイルが保存されているディレクトリを開く。 list.txtがあれば、それを開いてAAAAAなどのハッシュを作っておく。 ディレクトリにあるファイルの一覧を取得する。 それらを順番に開いて、そのファイルごとに一行ずつパターンマッチを行う。 AAA・・があれば、そのハッシュに、行数とその行のデータを配列で追加していく、 配列のハッシュを作成する。 最後に、書き込み用ファイルを開いて書き込む。 たとえば、 $hash{'AAAAAA'}=[(T0001_05_01,1,2010-05-01 00:00:00.000 N00001), (T0001_05_01,3,2010-05-01 00:00:10.305 N00002) ] とか、メモリーを消費するのでSEDなどストリームエディタを使うほうが早くて良いのだろうけど・・。
お礼
処理速度がなかなか改善できず、この処理では数日処理でも完了しませんでした。やり方は今後の参考にさせていただきます。
お礼
このプログラムで うまく解決できました。ありがとうございます。