• ベストアンサー

ファイルを分割する。

ひとつのファイルを3つのファイルに分けて保存するプログラムを作りたいと思います。 ファイル名 test.txt 内容 あああ いいい ううう かかか ききき くくく さささ ししし すすす というファイルを指定した行数ごとに違う名前で保存できるようにしたいのです。 SEEKとかでは指定した行では分けれないし、foreachではすべての行になってしまいます。 ファイル名 1.txt あああ いいい ううう ファイル名 2.txt かかか ききき くくく という感じで分けたいと思います。 よろしくお願いします。

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

  • ベストアンサー
回答No.3

my $file = "./test.txt"; open (FILE, $file) or die "$!"; chomp(my @lines = <FILE>); close FILE; my $n = 0; for my $line (@lines) { $n++ if ( $line =~ /^\s*?$/ ); open (FILE, ">> $n.txt") or die "$n.txtを作れませんでした。 : $!"; print FILE "$line\n" unless ( $line =~ /^\s*?$/ ); } close FILE; 物凄く適当ですけど。

hanabi100
質問者

お礼

ご親切にありがとうございます。 ちなみにmy $n = 0;というのは0行目から読み込むということなのでしょうか?

その他の回答 (3)

回答No.4

# 変数$nを定義 my $n = 0; # 空行が見つかったら$nに1を足す。 $n++ if ( $line =~ /^\s*?$/ ); # 例えば、$nが2だったら、2.txtを上書きモードで開く。なければ2.txtを作成する。 open (FILE, ">> $n.txt"); という処理に使っています。 本来なら、No.3での回答は必要無く、BLUEPIXY氏(No.1)の回答で十分なのですが、難易度が高いかな?と思い、追っていきやすそうなコードで書きました。 しかし、失礼ながらPerlを知らないとしか思えないのですが…

noname#191236
noname#191236
回答No.2

はじめまして、こんばんわ。 *最初に  ド素人なもので、かなり馬鹿なことをしている  かもしれませんので注意してください。(汗 #ファイルを開く open FILE,"test.txt"; #配列に代入 @dat =<FILE>; #カウンタ $cnt = 0; #行数指定 $num = 4; #ファイル インデックス $ind = 1; #配列分ループ foreach (@dat) { #カウンタ $cnt++; #ファイルを開く(追加) if ($cnt == 1) { open(FOUT,">> $ind.txt"); } #ファイルへ書込み print FOUT $_; #指定行数になった時 if ($cnt == $num) { #ファイルのインデックス $ind++; #ファイルを閉じる close(FOUT); #カウンタ $cnt = 0; } } #ファイルを閉じる close FILE; あとは、こういった所を参考にされては如何でしょうか。 http://www.harukaze.net/~haruka/cgi/cgipe4-1.html

hanabi100
質問者

お礼

回答ありがとうございます。 $cnt = 0;が2度かかれているのはなぜでしょうか?

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

質問者の意図とは違いますが、 ファイルが空行で区切られているので、3行毎というより、空行区切りでやるほうが楽です。 こんな感じ $/ = ''; #空行を区切りにする open(IN,"<data.txt"); while(<IN>){ open(OUT,">$..txt"); print OUT; close(OUT); } close(IN);

関連するQ&A