- ベストアンサー
ファイルを分割する。
ひとつのファイルを3つのファイルに分けて保存するプログラムを作りたいと思います。 ファイル名 test.txt 内容 あああ いいい ううう かかか ききき くくく さささ ししし すすす というファイルを指定した行数ごとに違う名前で保存できるようにしたいのです。 SEEKとかでは指定した行では分けれないし、foreachではすべての行になってしまいます。 ファイル名 1.txt あああ いいい ううう ファイル名 2.txt かかか ききき くくく という感じで分けたいと思います。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
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; 物凄く適当ですけど。
その他の回答 (3)
- shun_helloworld
- ベストアンサー率83% (5/6)
# 変数$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を知らないとしか思えないのですが…
はじめまして、こんばんわ。 *最初に ド素人なもので、かなり馬鹿なことをしている かもしれませんので注意してください。(汗 #ファイルを開く 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
お礼
回答ありがとうございます。 $cnt = 0;が2度かかれているのはなぜでしょうか?
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
質問者の意図とは違いますが、 ファイルが空行で区切られているので、3行毎というより、空行区切りでやるほうが楽です。 こんな感じ $/ = ''; #空行を区切りにする open(IN,"<data.txt"); while(<IN>){ open(OUT,">$..txt"); print OUT; close(OUT); } close(IN);
お礼
ご親切にありがとうございます。 ちなみにmy $n = 0;というのは0行目から読み込むということなのでしょうか?