- ベストアンサー
3の倍数行まで1から数字を挿入し,カウントアップしていく方法
よろしくお願いします.タイトル通り「3の倍数行まで1から数字を挿入し,カウントアップしていく方法」をテキストファイルで処理したいと思っています. 具体的にインプットとアウトプットは以下のようにしたいです. input.txt ----------------- a b c d e f g h i ・ ・ ・ ・ ・ output.txt ----------------- a,1 b,1 c,1 d,2 e,2 f,2 g,3 h,3 i,3 ・,4 ・,4 ・,4 ・,5 ・,5 perlでのファイルの読み込ませ方は理解していますので 読み込んで出力するまでの処理を教えていただけないでしょうか. よろしくお願いします.
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんな感じでどうでしょうか。 my $str = <<'TEXT'; a b c d e f g h i ・ ・ ・ ・ ・ TEXT my $i = 3; my $buf = ''; foreach(split(/\n/, $str)) { $buf .= "$_," . int($i / 3) . "\n"; $i++; } print $buf; exit;
その他の回答 (4)
- atom_seed
- ベストアンサー率48% (25/52)
foreach my $line (@file) { my $suji = ( int( my $count++ / 3 ) + 1 ); $line = "$suji,$line"; } ↑↑↑↑ my 宣言の位置を変えるとなおせます。 my $count; foreach my $line (@file) { my $suji = ( int( $count++ / 3 ) + 1 ); $line = "$suji,$line"; }
お礼
ご回答ありがとうございました.大変助かりました.
- Tacosan
- ベストアンサー率23% (3656/15482)
まさかそんな風に読み込むとは思わなかったよ.... while (<FILE>) { } ってやってるかと思った. そのように読み込んでるなら #3 の方法が簡単かな. まあ for my $i (0 .. $#line) { $line[$i] .= "," . int(($i+2)/3); } でもいいけど. ところで, 数字は行の前と後ろのどっちに付けるの?
補足
ご回答ありがとうございます.この読み方しかしらないもので... >ところで, 数字は行の前と後ろのどっちに付けるの? できれば,前の方がいいんです.
- Tacosan
- ベストアンサー率23% (3656/15482)
int(($.+2)/3) でいいような気がする.
補足
ご回答ありがとうございます.ですか以下のプログラムで実行したところ0しか挿入されませんでした.誤りがあると思いますのでご指摘いただけないでしょうか.よろしくお願いします. use strict; use warnings; my $dirname = '.'; opendir(DIR, $dirname) or die "$dirname: $!"; while (my $dir = readdir(DIR)) { next unless (-f $dir); next unless ($dir =~ /\.txt$/); open(FILE, $dir) or die "$dir: $!"; my @file = <FILE>; close(FILE); foreach my $line (@file) { my $suji = int(($.+2)/3); $line = "$suji,$line"; } open(NEWFILE, "> ./DOY/$dir") or die "$dir: $!"; print NEWFILE @file; close(NEWFILE); } closedir(DIR);
- atom_seed
- ベストアンサー率48% (25/52)
my $suji = ( int( $count++ / 3 ) + 1 ); ↑の式で、$suji を取得すれば、3回呼び出すと自動的に1大きい数字を返すようになります。
補足
ご回答ありがとうございます.ですか以下のプログラムで実行したところ1しか挿入されませんでした.誤りがあると思いますのでご指摘いただけないでしょうか.よろしくお願いします. use strict; use warnings; my $dirname = '.'; opendir(DIR, $dirname) or die "$dirname: $!"; while (my $dir = readdir(DIR)) { next unless (-f $dir); next unless ($dir =~ /\.txt$/); open(FILE, $dir) or die "$dir: $!"; my @file = <FILE>; close(FILE); foreach my $line (@file) { my $suji = ( int( my $count++ / 3 ) + 1 ); $line = "$suji,$line"; } open(NEWFILE, "> ./DOY/$dir") or die "$dir: $!"; print NEWFILE @file; close(NEWFILE); } closedir(DIR);
お礼
うまくいきました.ありがとうございました.
補足
ご回答ありがとうございます.ですが,すみません. どうも新しいことが多すぎて,うまくプログラムに組み込めません. なにとぞお願いします.