• ベストアンサー

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

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

  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • e_watt
  • ベストアンサー率71% (25/35)
回答No.1

1)読んだ行が区切られる単位なのか、要素なのかを分けて、 2)指定されたファイル名でオープンしたり、出力が終わったらクローズしたり を割とそのまま書けばよいかと思います。 # 質問文中ではコロンやスペースが全角なのでそのつもりで書いてあります my $items = 0; # これからファイルに出力する行数 while (<>) { if ($items == 0 && /:/) { # :の行が区切られる単位とし、 chomp; my ($name, $num) = split(/:/); $num =~ s/ //g; # 全角スペースが入っているようなので消しておく $items = int($num); # :の後の数字がそのグループに入る要素数である。 print "$name, $items\n"; open OUT, ">$name" or die "Cannot open $name..."; }elsif ($items > 0) { # データ数分出力 print OUT $_; if (--$items == 0) { # 最後の項目だったら close OUT; # ここでおしまい } } } # 最初の if に $items == 0 が入れてあるのは、項目にコロンが入っていたらハマるからですが、 # 先に if ($items > 0) { ... } elsif (/:/) { ... } と書けば条件式はシンプルになります。 # ここでは(データファイルの出力順に合わせて)グループ名の指定かどうか判定する方を先にしました。

1204533
質問者

お礼

1行1行 何をやっているか説明いただき、ありがとうございます。 まさに このような方法でやりたかったので、これを参考にし、実行してみます。

関連するQ&A

  • テキストファイルを読み込むには・・・。

    テキストファイルの中身が以下のように abcd,efg,hij,klmn↓ opqr,stu,vwx,yzab↓ cdef,ghi,jkl,mnop↓ .         .          .         .         のように何行あるか分からない状態で1行ずつ,と\0で区切って4つの文字列を取り出したい(上のテキストファイルの1行目だと[abcd][efg][hij][klmn]のように)のですがどのようにすればいいのでしょう?できれば余分なメモリを確保するやり方を避けたいです。

  • 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
  • 一行だけ読込

    Perlでのファイルの読込なんですが、 open(IN,"A.txt"); while ($xx = <IN>) { print $xx;} close(IN) とするとA.txtファイルの読込をするんですよね? A.txtの中の一行だけを読込むというのはできるんでしょうか? (10行あったら5行目を読込み、という感じです。)

    • ベストアンサー
    • Perl
  • perlで指定範囲を複数ファイルに分割する方法は?

    お世話になります。 perlを使用して、 下記の元ファイル[infile.txt]よりstart~endの範囲を各テキストファイルに 分割出力する方法をご教授いただけないでしょうか。  ※出力ファイル名は元のファイル名 (infile) + 1行目の文字列(単語)にします。   例>>infile_1111.txt , infile_333.txt よろしくお願いいたします。 [infile.txt] aaaa bbbb start 1111 2222 end dddd eeee start 3333 4444 end

  • ファイルからの入力

    document.txt(↓document.txtの中身) ===================== abcdefg hij klmnopq rstuv w xyz ===================== というテキストファイルを読み込んで 3行目の"klmnopq"という文字列だけ char word[10]に代入するということはできるのでしょうか? もし可能なら方法をおしえてください

  • ファイルをある文字列で分割したいです。

    数百MBの1つのログファイルがあります。 これを月ごとのファイルに分割しようと思ってます。 大きすぎて既存環境のviでは開けないので、コマンドやスクリプトで分割しようと考えてます。 とりあえず今年の3月(Mar)~7月(Jul)と5つ月ファイルに分割できればいいです。 perlで1行ずつチェックしようかと思ってましたが、 間違いなくもっと簡単に処理できるかと思い投稿しました ^ ^;; シェルはcshです。 よろしくお願いいたします。

  • Perlでのテキスト変換方法に関して

    テキストファイルをperlを使用して下記のように 変換したいと思っています。 --------------------------- 【変換前】 aaa 8000 52 ---1行目 abc 200 48 ---2行目 cbd 250 31   ---3行目 efg 98 45   ---4行目 abc 390 68   ---5行目 ddd 89 90   ---6行目 aaa 65 40   ---7行目 fed 900 66   ---8行目 efgh 99 49 ---9行目 abc 40 40 ---10行目 【変換後】 aaa 8000 52   ---1行目 cbd 250 31   ---3行目 efg 98 45   ---4行目 abc 390 68   ---5行目 ddd 89 90   ---6行目 fed 900 66   ---8行目 efgh 99 49 ---9行目 ---------------------------- やりたいことはまず行の先頭文字列(aaaやabc)が完全に一致する行が 複数あれば(2,5,10行目のabcや1,7行目のaaa)、2番目の文字列(スカラー値)の値が 小さい方の行は出力しないようにしたいと思っています。 例えば上記の場合ですと、2,5,10行目の最初の文字列はaaaで完全に一致しており、 2番目の列の値は5行目が390に対し、2行目は200、10行目は40と小さくなっているため 2行目,10行目は出力されない、というのが望んでいる動作です。 sortを使用してどうにかならないかとも、考えたのですが そこから先がどうしていいか思いつきませんでした。 何かよい方法を思い浮かぶ方がいましたら、どのようにPerlで記述すればよいのか 教えて頂けないでしょうか? 宜しくお願いいたします。

    • ベストアンサー
    • Perl
  • perlでFTP

    ローカルPCからPerlで記述されたプログラムを実行し、 FTPサーバーへファイルをアップロードするPerlプログラムを教えてください。 DOS上では、 ftp open ftpサーバー名 ユーザー名 パスワード put 送信するファイル bye となるのですが、それをPerlで記述すると、どのようになるのでしょうか?

    • ベストアンサー
    • Perl
  • Perl はどのくらい高負荷に耐えられますか?

    掲示板の運営をしているのですが、 将来アクセスが増えた時に備えて、 高い負荷に耐えられるようなCGIにしたいと思っています。 ちなみに現在はPerlで記述しています。 一つのCGIでいろいろ対応しているので、 ボリュームは2000行(70KB)くらいになっています。 そこで質問なのですが、 (1)Perlで記述したCGIはどの程度の負荷に耐えられるのでしょうか? (ちょっと漠然としていて申し訳ありません) (2)軽くするにはどういう事を検討すればよいでしょうか? (PHPにするとか、Cで書くとか、CGIを分割するとか)

    • ベストアンサー
    • CGI
  • perlでの別ファイルへの出力について

    perlでファイルAから読み出した値を別ファイルBに出力させたいです。 イメージとしては -------------------------------- open(FILE,ファイルA); while(<FILE>){ my $line = "$_"; system("ls -l $line"); #←ここの結果を1行ずつファイルBに出力したい } close(FILE) --------------------------------- 上記の場合どのように記述すれば良いのでしょうか? bashでは簡単にかけるのですが、 業務上perlを使用する必要がある為こまっております…。

    • ベストアンサー
    • Perl

専門家に質問してみよう