単二電池

ひとつのファイルを3つのファイルに分けて保存するプログラムを作りたいと思います。

ファイル名 test.txt
内容
あああ
いいい
ううう

かかか
ききき
くくく

さささ
ししし
すすす

というファイルを指定した行数ごとに違う名前で保存できるようにしたいのです。
SEEKとかでは指定した行では分けれないし、foreachではすべての行になってしまいます。

ファイル名 1.txt
あああ
いいい
ううう

ファイル名 2.txt
かかか
ききき
くくく
という感じで分けたいと思います。
よろしくお願いします。

A 回答 (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;

物凄く適当ですけど。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/12/13 23:31

# 変数$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を知らないとしか思えないのですが…
    • good
    • 0

はじめまして、こんばんわ。




*最初に
 ド素人なもので、かなり馬鹿なことをしている
 かもしれませんので注意してください。(汗

#ファイルを開く
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
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/12/13 23:37

質問者の意図とは違いますが、


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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!