• ベストアンサー

ファイルの処理について

数百行のテキストファイルを5行づつ取り込んで処理をしたいのですが。。 どうすればいいのでしょうか? 一行づつは可能なんですが。。。 While(<FILEHANDL>){ 処理 } ヘルプ~。。。。

  • Perl
  • 回答数3
  • ありがとう数2

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

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.2

No1 です。 最後が5行未満になった場合のことを忘れていました。 訂正します。 my @five_lines; while (<FILEHANDLE>) { push @five_lines, $_; unless (eof(FILEHANDLE)) { next if $. % 5; } # ここで @five_lines を処理する @five_lines = (); }

stockjp
質問者

補足

回答ありがとうございます。 すみません。%5の意味がわからないのですが。。

その他の回答 (2)

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.3

% は、剰余演算子です。次の式は、 next if $. % 5; $. (現在の行番号) を 5 で割った余りを求めているものです。 余りが1から 4 までは真になりますので、次の行を読み込みます。 $. が 5 で割れる数字になると余りが 0 になるので偽になり、@five_lines に5行読み込んだことになるので、次の処理に移ります。

stockjp
質問者

お礼

ありがとうございます。 助かりました。

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.1

特殊変数の $. を利用する方法があります。 my @five_lines; while (<FILEHANDLE) { push @five_lines, $_; next if $. % 5; # ここで @five_lines を処理する @five_lines = (); }

関連するQ&A

  • C言語のテキストファイルの読込み

    必要に迫られてC言語でテキストファイルの読込みを行う プログラムを作成しなければならなくなりました。 whileとfscanfを用いて書式を指定して一行ずつ読込むことができる ということは知っていますが、その際、たとえば読み込むファイルが 20行のテキストファイルだったとして、10行目から読込みを 行いたい場合はどのようにプログラムを書けばいいのでしょうか? なにぶんC言語初心者ですのでよろしくお願いします。

  • テキストファイルをwhileでブロック毎に処理がしたいのです。

    テキストファイルをwhileでブロック毎に処理がしたいのです。 シェルスクリプトにてlinuxコマンドを使用し行いたい処理で御座います。 例 func(){ #ブロックでの処理 awk ~~~~~~ } while do sed -n -e 'スタート行,/^特定文字/p' source.txt func() done 特定文字は必ず出現し、ブロック処理を行った後特定文字の次の行がスタート行となりループを させたいのですが、どうしてもやり方が解らずめげています。 御手数お掛け致しますがどなたか教えて頂けると幸いです。

  • perl 複数ファイルから一行ずつ読み込んで比較

    初心者向けのperl参考書がなんとか理解できる程度のperl初心者です。 一週間ほど思考錯誤してきたのですが、いくらスクリプトを書いてもどうしても自分では解決できない処理がありましたので、初めてなのですが、質問させていただきました。 二つの同じ形式の、一部情報だけ異なるファイルから一行ずつ配列を読み込んで、数値の大小を比較したいのですが・・・ ファイル構造は、下のように2行でひとつのtextデータの情報を表示する形式となってまして、 奇数行には、各textファイルの情報が、.以下の部分に4552221.2:(30.2):100、のように記載されています。 偶数行には、各テキストファイルの、IDとなる情報が、13333331のように記載されています。この奇数行と、偶数行一行ずつで、ひとつのtextデータの 情報を表しています。textというファイルは、text1から順に,text2000000まで、 2000万程度,行で言えば4000万行ほど存在しています。よって、file1もfile2も、同じ行であれば、同じtextで、同じIDのものを示しています。ずれはありません。 file1 ----------------------------- >text1. 4552221.2:(30.2):100 13333331 >text2 87999999 >text3. 3444444.1:(20.0):300 75533333 ----------------------------- 数値は意味が変わらない範囲で、比較しやすい数値に変えてあります。 この上のfile1と、下のfile2を比べたいのですが、 file2 ----------------------------- >text1. 4552221.2:(20.9):100 13333331 >text2 87999999 >text3. 3444444.1:(23.3):300 75533333 ----------------------------- 偶数行のtextファイルの欄が大事で、text名のドット(.)の後に、続けて数値が書いてある場合(上ではtext1とtext3が該当)、そのドットの後の括弧()で囲まれた中の数値の大小を比較して、 差が一定以上あるtextだけを出力するスクリプトが書きたいと思っているのですが、 これをいきなりすべてひとつのスクリプトにまとめるのは、私の知識と力量では到底無理なので、ひとつひとつ段階を踏んで処理していこうと考えました。 1、奇数行の、text.の後半に情報があるもの場合、tempファイルにその奇数行と、対になる偶数行を出力する。それを、file1、file2、個別に行う。(temp1、temp2を出力) file1で取り除かれる3、4行目のtext2は、file2でも必ず取り除かれるので、1の処理後も、file1と2の各行は、比較することが可能な状態です。 2、正規表現を使って、各行の()で囲まれた部分の最初の2桁の数字(一部は一桁の数字の場合もあり)、をtempに出力する。(temp3、temp4を出力) (この処理を行わなくても可能かもしれませんが、ややこしいので、数字だけ出すようにしました) 最後に、file1とfile2の各行の数字を一行ずつ読み込んで、数値に一定以上の差がある行の情報だけ出力したいのですが、各行を順番に分析できる方法は、while文か、配列に読み込む方法しか知りません。 前者のwhile文では、ファイルオープンは、ひたつ以上は同時には取り扱えないという情報を得たので、使えない思っています。後者の配列に読み込む方法は、桁が大きいので、実用的ではないと感じています。 二つ以上のファイルの各行の特定の数値データを、一行ずつ順に比較して、差があるものだけ抽出するにはどのようなスクリプトを書けばよいのか、ご教授下さい。 いろいろ調べましたが、(僕の調べ方が悪いと思いますが)適切なコマンドや方法にたどり着けません。 試してみた方法 ファイルハンドルを二つ指定して、while文の条件中に、andで条件を二つ指定してファイルハンドルから読み込んでやればよいと思ったのですが、実行するとエラーになってしまいます。ググっていろいろ調べてみたところ、ファイルハンドルの二つ指定はできないとの記述を見つけたので、whileの条件に複数のファイルハンドルを記述するこの方法はあきらめて、ここで、ストップしています。 まわりに、perlを扱える方がいらっしゃれば質問に伺うのですが。もしよろしければ、簡単でもご教授いただけますと幸いです。宜しくお願い申し上げます。

    • ベストアンサー
    • Perl
  • ファイルを読み込むプログラムについて

    下のプログラムで分からない所がありますので、教えて頂ければと思います。宜しくお願い致します。 text = fgets(buf,256,fp);はfpのファイルから一行を読み込んでbufに格納するという処理ということは分かります。でも、while文内なので次にこの処理をする時に今度は、2行目(下の段)を読み込むはずですが、プログラム中のどこに2行目に移動させる処理があるのか分かりません。 予想ですが、text = fgets(buf,256,fp);の中にそのような意味の処理が含まれているのでしょうか? どなたかご教授お願い致します。 #include <stdio.h> int main(void) { FILE *fp; char buf[256]; char *text; char flname[256]; printf("ファイル名:"); gets(flname); fp = fopen(flname,"r"); do{ text = fgets(buf,256,fp); if(text != NULL){ printf("%s",text); } }while(text != NULL); fclose(fp); return(0); }

  • ファイル処理をしたいのですが...

    C++を使ってファイル処理をしたいと思っています。 処理の内容は、以下の通りです。 (1) ファイルを読み込む (2) そのファイル内のあるキーワードから数カラム後の8カラム分の文字を探す (3) 次の行に移り、(2)の作業を繰り返す (4) あるキーワードが出てきたらその作業を終了 (5) その探した文字を別ファイルに出力する ちょっと分かりづらくてすみません。 初心者なもので。 何か参考になること、テキストやURL等あれば教えていただきたいです。 よろしくお願いします。

  • ファイルの読み込みと置き換え

    Perlでテキストファイルを読み込み、テキストの一部を置き換えをするというプログラムを作っています。 用意されているテキストファイルは複数行あるもので、リスト作成ツールのフリーソフトにより作成されています。 目的はファイルを読み込み、一行一行中を見て特定の文字を置き換えて、最後に配列に一行一行いれていくというものです。 逆に配列に一度いれて一個一個置き換えてもOKで、結果が同じならばOKです。 以下にそのプログラムを書きます。 ############################## open(IN,"list.txt") || die "ファイルが見つからないので終了します。"; @file = <IN>; $count=@file; while(<IN>){ $_=~s/xls/エクセルファイル/; print "置き換え中!残りあと$count行です\n"; $count-- } close(IN); print"@file[18]","\n"; ############################## 最後の行で置き換えが成功したか見てますが、これを実行しても何も表示されません。 もちろん行数は18行どころか100行くらいあります。 たぶん配列の入れるタイミングとか何かが間違っていると思うのですが、どこで間違っているのかがよくわかりません。 教えていただけると助かります。

    • ベストアンサー
    • Perl
  • バッチファイル

    すみません 教えていただきたいことがありますぅ 今、バッチファイルで テキストファイルの最後の一行を読み込んで、その読み込んだ行を べつのテキストファイルに書き込む という機能をもったものを作成したいです。 初歩的な質問なのかも知れませんが、あたしはわかりません(@_@) すみませんけど、よろしくお願いしますぅ

  • fgetsの処理を詳しく説明してください、お願いします。

    char line[100]; (stream = fopen( "test.c", "r" )) == NULL; while( ( fgets( line, 100, stream ) != NULL)){ printf( "%s", line); } fclose( stream ); 上記のコードでファイルが一行ずつ表示されるのですがなんとなくでfgetsを使っていたのでwhile文中のfgetsの動きがよく分かりません。 初めに改行文字までの一行を読み込むのはわかるのですが、何故繰り返すときlineに2行目、3行目、・・・ と取り込むのかがわかりません。 よろしくお願いします。

  • テキストファイルの処理について

    初心者です。 PHP5を始めて約50時間程度です。 テキストファイルの処理についての質問です。 fgets,file_put_contents,str_replace,array等の関数を使い処理するのだと思います。 構文が組み立てられません。 参考になるサイト等アドバイスいただけると幸いです。 よろしくお願いします。 下記の様な元になるテキストファイルがあります。 1.最初の文字があるまで(=改行だけの行)は削除 2.最初の文字列の最後に”,”を入れ改行をとる 3.次の行と次の次の行は削除 4.次の行は、例:7月4日(土)を7,4,土に 5.次の行は、例:10:00~13:00を10:00,13:00に 6.次の行と次の次の行は削除して改行 7.次の行と次の次の行は削除 8.前述1から7までの繰り返し *最終的には後述のようなテキストファイルになります ----元になるテキストファイル 植物の光合成 理科 3 相田ももこ 7月4日(土) 10:00~13:00 30名 5,000円 鎌倉時代 社会 3 土田正 7月4日(土) 14:00~17:00 30名 5,000円 生物の進化 理科 6 長谷川浩 7月4日(土) 10:00~17:00*会場は大阪です 16名 10,000円 ----元になるテキストファイル以上 ---完成後のファイル 植物の光合成, 理科,7,4,土,10:00,13:00 鎌倉時代,社会,7,4,土,14:00,17:00 生物の進化,理科,7,4,土,10:00,17:00 ---完成後のファイル以上

    • ベストアンサー
    • PHP
  • C#のテキストファイル読み込みについて

    C#のテキストファイル読み込みについて 2次元配列を使います(a[行][列]みたいに テキストファイルを1文字ずつ読み込みます。 そして、改行文字が見つかると行を1つずらします それを繰り返して最後まで読みこむと終わり そんなことをしたいです DOBON.NETでこんなの見つけたんですが 上の処理をしようと思っても、どこをいじればできるのかわかりませんでした //"C:\test.txt"をShift-JISコードとして開く System.IO.StreamReader sr = new System.IO.StreamReader( @"C:\test.txt", System.Text.Encoding.GetEncoding("shift_jis")); //内容を一行ずつ読み込む while (sr.Peek() > -1) { Console.WriteLine(sr.ReadLine()); } //閉じる sr.Close(); よくわかるサイトとかあったら教えてください、お願いします

専門家に質問してみよう