• ベストアンサー

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でのファイルの読み込ませ方は理解していますので 読み込んで出力するまでの処理を教えていただけないでしょうか. よろしくお願いします.

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

  • ベストアンサー
  • pick52
  • ベストアンサー率35% (166/466)
回答No.3

こんな感じでどうでしょうか。 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;

oswll
質問者

お礼

うまくいきました.ありがとうございました.

oswll
質問者

補足

ご回答ありがとうございます.ですが,すみません. どうも新しいことが多すぎて,うまくプログラムに組み込めません. なにとぞお願いします.

その他の回答 (4)

  • atom_seed
  • ベストアンサー率48% (25/52)
回答No.5

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"; }

oswll
質問者

お礼

ご回答ありがとうございました.大変助かりました.

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

まさかそんな風に読み込むとは思わなかったよ.... while (<FILE>) { } ってやってるかと思った. そのように読み込んでるなら #3 の方法が簡単かな. まあ for my $i (0 .. $#line) { $line[$i] .= "," . int(($i+2)/3); } でもいいけど. ところで, 数字は行の前と後ろのどっちに付けるの?

oswll
質問者

補足

ご回答ありがとうございます.この読み方しかしらないもので... >ところで, 数字は行の前と後ろのどっちに付けるの? できれば,前の方がいいんです.

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

int(($.+2)/3) でいいような気がする.

oswll
質問者

補足

ご回答ありがとうございます.ですか以下のプログラムで実行したところ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)
回答No.1

my $suji = ( int( $count++ / 3 ) + 1 ); ↑の式で、$suji を取得すれば、3回呼び出すと自動的に1大きい数字を返すようになります。

oswll
質問者

補足

ご回答ありがとうございます.ですか以下のプログラムで実行したところ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);