perlプログラム 外部複数ファイルの読み込み処理について

このQ&Aのポイント
  • perlプログラムを使用して外部複数ファイルの読み込み処理を行いたい場合、どのように実装すればよいのでしょうか?31個のファイルがあるフォルダから一つずつファイルを読み込み、別のリストに含まれる値が各ファイルの何行目に含まれているかを出力するPerlプログラムを作成したいです。
  • Perlプログラムを使用して外部の複数のファイルを読み込む方法について教えてください。31個のファイルがあるフォルダに格納されており、別のファイルには一意な値が格納されています。この一意な値が各ファイルの何行目に存在するかを出力するPerlプログラムを作成したいです。
  • 外部の複数のファイルをPerlプログラムで読み込む方法について教えてください。31個のファイルがあり、別のファイルには一意な値が含まれています。これらの一意な値が各ファイルのどの行にあるかを出力するPerlプログラムを作成したいです。どのように実装すればよいのでしょうか?
回答を見る
  • ベストアンサー

perlプログラム 外部複数ファイルの読み込み処理について

perlプログラム 外部複数ファイルの読み込み処理について あるフォルダに T0001_05_01,T0001_05_02,T0001_05_03,…,T0001_05_31 という31個のファイルがあります。 それぞれのファイルは 下記のような 形式で記述されております。 (例 T0001_05_01のファイルの中身) 2010-05-01 00:00:00.000 N00001 AAAAAA 2010-05-01 00:00:00.108 N00018 BBBBBB 2010-05-01 00:00:10.305 N00002 AAAAAA 2010-05-01 01:00:10.966 N00008 CCCCCC … また、別のlist.txtに 下記のようなユニークなリストが入っております。 AAAAAA CCCCCC WWWWWW … このとき、list.txtの値が それぞれT0001_05_XXファイルの何行目に出力されているか 出力するperlプログラムを作成したい。 (出力結果イメージ:1ファイル化) T0001_05_01 1行目 2010-05-01 00:00:00.000 N00001 AAAAAA T0001_05_01 3行目 2010-05-01 00:00:10.305 N00002 AAAAAA … T0001_05_31 10行目 2010-05-31 03:00:00.999 N00400 AAAAAA T0001_05_01 4行目 2010-05-01 00:00:00.000 N00008 CCCCCC … perlプログラム知識がないものなので、このようなファイルの出力の仕方がわかりません。 教えていただけると助かります。

  • Perl
  • 回答数3
  • ありがとう数15

質問者が選んだベストアンサー

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.2

サンプルプログラムを作成してみたので試してみてください。 テストしていないのでうまく行かないことがあるかも知れません。 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;

1204533
質問者

お礼

このプログラムで うまく解決できました。ありがとうございます。

その他の回答 (2)

  • JaneDue
  • ベストアンサー率75% (263/350)
回答No.3

まだ解決しませんか? もし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で出してます。適宜ブラウザ上でコピーしてください。

1204533
質問者

お礼

ボリュームが多く何百万行もあるため、grep実行はすでに試みたのですが、処理時間がかかってしまいました。プログラム初心者のため このプログラム内容は今後の参考にさせていただきます。ありがとうございます。

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.1

まず、それらのファイルが保存されているディレクトリを開く。 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などストリームエディタを使うほうが早くて良いのだろうけど・・。

1204533
質問者

お礼

処理速度がなかなか改善できず、この処理では数日処理でも完了しませんでした。やり方は今後の参考にさせていただきます。

関連するQ&A

  • 複数行にわたる処理

    こんばんは。perl初心者です。 どうしてもわからないので、どうかアドバイスよろしくお願いします。 一つのファイルに、以下のような3行で一組の塊がある場合、 <line_a>: aaaaaa <line_b>: BBBBBB <line_c>: cccccc <line_a>: aaaaaa <line_b>: bbbbbb <line_c>: cccccc ... <line_b>の行に文字列"BBBBBB"が含まれていたら、<line_a>の内容を"aaaaaa"から"AAAAAA"に置換してファイルを上書きしたいのですが、 どうやったらいいのでしょうか・・・。

    • ベストアンサー
    • Perl
  • シェル:複数ファイルの計算方法に困ってます

    ファイル毎に使用容量を管理するシェル作成中、下記の内容で困ってます。いいアイデアを教えていただけないでしょうか。 よろしくお願いします。 【 前日分 】old.txt                カウント 使用量 ファイル名                5 10 aaaaaa.txt         5 15 bbbbbb.txt 3 20 dddddd.txt  【 当日分 】 new.txt  カウント 使用量 ファイル名 1 50 aaaaaa.txt 1 65 bbbbbb.txt 1 15 cccccc.txt 【理想】new.tmp カウント 使用量 ファイル名 6 60 aaaaaa.txt 6 80 bbbbbb.txt 1 15 cccccc.txt 3 20 dddddd.txt new.txtと同じ名前がold.txtにあれば、カウント列・使用量列をそれぞれ加算しnew.tmpに出力。 new.txtにあってold.txtに無い場合はそのまま行をnew.tmpに出力 new.txtになくてold.txtにある場合もそのまま行をnew.tmpに出力 説明 カウント・・・毎日加算処理をしカウントを上げていく        (よってnew.txtのカウントは必ず "1") 使用量・・・ファイルの使用量 ファイル名・・・ファイル名 上記のようなことは出来るでしょうか? diff・grep・sedとか調べてみたんですが融合技が見当つかず・・・ よろしくお願いします。

  • Accessのクエリとテーブル突合せについて

    いつもお世話になっています。 Access2007で下記のような2つのテーブルをクエリで比較した際、なぜかNULLの部分だけのぞんだ結果にならないという現象があり、理由がわからず困っています。 内容としては、「(1)明細データ」のすべてと、「(2)コード表」をあて、「(3)結果リスト」のような表示でコードを追記するようなものです。 下記の「__」は表記の便せん上分かりやすいようNULLを示しています。 「(1)明細データ」はクエリで2つのテーブルを突き合わせ「区」を付けたしたもので、「(2)コード表」はマスタ用のテーブルとして手作りしています。 「(2)コード表」を手作りする際にはNULLの部分はなにも入れずに空にしています。 (1)明細データ 商品名 区 AAAAAA XX BBBBBB YY BBBBBB YY CCCCCC XX CCCCCC YY CCCCCC __ (2)コード表 商品名 区 変換CD AAAAAA XX 000101 AAAAAA YY 000102 AAAAAA __ 000199 BBBBBB XX 000201 BBBBBB YY 000202 BBBBBB __ 000299 CCCCCC XX 000201 CCCCCC YY 000202 CCCCCC __ 000299 (3)結果リスト 商品名 区 変換コード AAAAAA XX 000101 BBBBBB XX 000201 BBBBBB YY 000202 CCCCCC XX 000301 CCCCCC YY 000302 CCCCCC __ 000399☆ ところが、クエリで実現しようとするとこの「(3)結果リスト」の☆のついている一番最後の結果が CCCCCC __ ______ となってしまい、変換コード部にコードを埋め込むことができません。 こういう現象は初めての為、どのように聞くべきかわからないのですが、もし何かご存知、ないし、ヒントになり得ることを知っておりましたらお教えください。 以上、よろしくお願いいたします。

  • エクセル/行選択の仕方を教えてください。

    はじめまして。 エクセルで、3行ごとに選択し、選んだ情報を列に移す作業をしたいのですが 1800行あり手で選択するのが大変です。 行いたい作業は以下の通りです。 A列 AAAAAA BBBBBB CCCCCC AAAAAA BBBBBB CCCCCC AAAAAA BBBBBB CCCCCC AAAAAA ↓ A列 B列 C列 AAAAAA BBBBBB CCCCCC AAAAAA BBBBBB CCCCCC AAAAAA BBBBBB CCCCCC 一行一行選択して列に移すのではなく選択できる方法がありましたら 是非ご教授ください。 よろしくお願いいたします。

  • perl シングルコーテーションを含んだ文字編集

    active perl(アクティブパール)で 以下の文字列編集を行いたいのですが、 シングルコーテーションの編集で上手く出来ずに困っています。 どなたか経験豊富な方、良いコーディング方法があれば ご教授下さい。 やりたい事としては、 文字列 aaaaaa bbbbbb cccccc dddddd といった内容を 取り込んで 'aaaaaa','bbbbbb','cccccc','dddddd' といった文字列の出力を行います。 上記の例では文字はddddddまでですが、 場合により bbbbbbまでたったりといった感じで 変換前の文字の行数は可変で、2行でも3行でも4行でも、 各行の文字をシングルコートで囲って、カンマでつなげた文字列を出力します。 上記の仕様内容で、こうすれば出来る! といったサンプルコードを教えていただけると助かります。

  • Excelで複数行の置き換えを行いたい

    Excelで複数行の置き換えを行いたいと考えています。 例えば、Excelのシートの中身が aaaaaa bbbbbb cccccc bbbbbb aaaaaa bbbbbb であったとします。このとき、 aaaaaa bbbbbb を zzzzzz vvvvvv に置き換えて、 zzzzzz vvvvvv cccccc bbbbbb zzzzzz vvvvvv というようにしたいです。 なにか良い方法はないでしょうか?

  • エクセルのデータを一部抽出する方法をお教えください

    こんにちは。宜しくお願い致します。 エクセルのA列に以下の番号が入っています。  A  ――――――― 1|AAAAAA-01 2|AAAAAA-02 3|AAAAAA-03 4|BBBBBB-01 5|BBBBBB-02 6|BBBBBB-03 7|CCCCCC-01 8|CCCCCC-02 9|CCCCCC-03 10|・ 11|・ 12|・ 同じ番号にそれぞれ「-01」「-02」「-03」がついてしまっています。 この情報で、「-01」のみの行を抽出したいのですが、難しく考えてしまったせいか、上手く行きません。 エクセルにお詳しい方、方法を教えて下さい。 宜しくお願い致します。

  • EXCLEのマクロ データの絞り込み

    EXCELのマクロについてご教授願います。 数百件のデータで、C列は同じデータは複数あるが、A列に関して別のデータが入っている。B列もほぼ同じデータ ここで条件として C列が同じデータで、A列に特定のワードが入っているデータだけを残し、他のデータを削除するというマクロを組むことは可能でしょうか。 例えば下記のようなデータで、「abcd」だけ残し 他のデータは削除する    A         B        C 1  abcd      AAAAAA      BBBBBB 2  EFGA      AAAAAA      BBBBBB 3  hijk      AAAAAA      BBBBBB 4  lnms      AAAAAA      BBBBBB 5  abGG      PPPPPP      WWWWWW 6  EFTT      PPPPPP      WWWWWW 7  POII      PPPPPP      WWWWWW 2行目から4行目と6行目委から7行目を削除し以下のような データにする。常にA列のデータに ab というキーワードが 入っていて、Cが同じデータは、abが入っているデータのみ 残し他を削除する    A         B        C 1  abcd      AAAAAA      BBBBBB 5  abGG      PPPPPP      WWWWWW のみにする

  • perl 読込ファイルの分割について

    下記のようなファイルがあります。 1234: 4(グループ名: 要素数) AB(要素1) CD(要素2) EFG(要素3) HIJ(要素4) 2345: 1(グループ名: 要素数) XYZ(要素1) ○○: XX ・・・ :の行が区切られる単位とし、:の後の数字がそのグループに入る要素数である。 その要素数毎にファイル分割(要素のみ記述されたファイル)したいです。 perlプログラムで どのように書けば よいのか教えてください。

    • ベストアンサー
    • Perl
  • VC++でperlプログラムを動かすには

    VC++でOpenGLを動かしているんですが, その途中でperlのプログラムを動かしたい場合,どうしたらよいのでしょうか? 詳しい動きとしては, 1.perlのプログラムを動かして,txtデータを出力する 2. その出力したtxtをOpenGLの中で読み込んで,描画を表示 3.再びperlのプログラムを動かして,新しいtxtデータを出力する 4. その出力したtxtをOpenGLの中で読み込んで,描画を表示 この繰り返しです. この一連の動作をVC++でいっぺんに行いたいのですが, 可能でしょうか? 何かもっと詳細が知りたい場合は,なんでも聞いてください! よろしくお願いします.

専門家に質問してみよう