• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:perlでテキストファイルを加工する時、前を検索(上向きに検索)するには?)

perlでテキストファイルを上向きに検索する方法とは?

このQ&Aのポイント
  • perlでテキストファイルを加工する際に、上向きに検索する方法を教えてください。
  • 特定の語句が出現した時に、そのブロックの先頭から抜き出す方法を知りたいです。
  • テキストファイルを「check.txt」と「normal.txt」に分けて保存する方法についても知りたいです。

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

  • ベストアンサー
  • Werner
  • ベストアンサー率53% (395/735)
回答No.2

> my $tmp='tmp.dat'; > (中略) > print NEWFILE $tmp; NEWFILEに文字列'tmp.dat'を出力してるみたいだけど、 これが出力したい内容なのですか? > open(NEWFILE, '>> $tmp') or die "$!"; > (中略) > if ($flg==1){ > open(NEWFILE, '>> check.dat') or die "$!"; これではwhileループ内でNEWFILEに対してopenが2回連続で行われてしまいます。 これでは一回目のopenで得られたファイルハンドルを見失ってしまいますよ。 また、 > if ($line eq "head") が成立するときはcloseも2回行われてしまいます。 そもそもループ内で同じファイルのopen/closeを繰り返すのは非効率だからやめたほうが良い。 今回の場合はループ前で必要なファイルを全部openして、 最後に全部closeすれば問題ないはず。 (当たり前だけどファイルハンドルの名前は全部違うものにしてね。) あと、$lineには改行コードが含まれるので > if ( $line eq "#check line#" ){$flg=1;} > if ($line eq "head"){ これらのif文が成立することはないと思います。 改行コードが含まれていても大丈夫なように書いてください。 (あらかじめchompするとか、部分一致で検出するとか、改行を含む文字列と比較するとか。) > フラグの設定の仕方、蓄積の方法について教えていただけますでしょうか フラグの設定はそんな感じでよいとして、 蓄積は適当な変数(下の例では$buf)に$lineの内容をどんどん足していけばよい。 で、フラグをクリアするタイミングで$bufを空にする。 my $buf = ""; while (my $line = <FILE>) {  $buf .= $line;  # 略  if ($line =~ m/^head/){   if($flg==1){    #check.txtに$bufを出力   }else{    #normal.txtに$bufを出力   }   $flg=0;   $buf = ""; #$bufを空に  } } あとheadを見つけたときだけじゃなくて、 最終行に到達したときもファイル出力する必要がないですか?

okusr
質問者

お礼

詳しい回答どうもありがとうございました!最終行に来たときの記述を追加し、うまくいきました。本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • Werner
  • ベストアンサー率53% (395/735)
回答No.1

いや、さかのぼる必要なんて無いでしょう。 1行ずつ読むときにその内容を蓄積しておいて、 ブロックの最後に来たときに一気に出力すればよい。 で、出力後はフラグと一緒に蓄積した内容をクリアする。

okusr
質問者

補足

すみません、初心者なもので現在のスクリプトは以下のようになっています。 my $tmp='tmp.dat'; my $flg=0; open(FILE, 'sample.txt') or die "$!"; while (my $line = <FILE>) { open(NEWFILE, '>> $tmp') or die "$!"; print NEWFILE $line; if ( $line eq "#check line#" ){$flg=1;} if ($flg==1){ open(NEWFILE, '>> check.dat') or die "$!"; print NEWFILE $tmp; close (NEWFILE); } else{ open(NEWFILE, '>> normal.dat') or die "$!"; print NEWFILE $tmp; close (NEWFILE); } if ($line eq "head"){ $flg=0; close (NEWFILE); } } close(FILE); フラグの設定の仕方、蓄積の方法について教えていただけますでしょうか

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • テキストファイルの特定の一行だけを表示する方法

    テキストファイルの特定の一行だけを表示する方法を教えてください。 具体的には、text.txtを読み込んでおき、nと入力されたら、n行目を表示させたいです。 ・ファイルを読み込む ・ユーザーからの入力を待つ ・String line = text.txtのn行目の文字列; というようにする← ・lineを表示する というプログラムになるかと思いますが、特に矢印のついているところが分かりません。 初学者なのでかなり単純な質問とは思いますが、よろしければお教えください。

    • ベストアンサー
    • Java
  • 複数テキストを一行ずつファイル名を付けて結合する方法

    複数テキストを一行ずつファイル名を付けて結合する方法 フォルダにある複数のテキストデータを1つのテキストデータに結合する際、テキスト1行毎の先頭にファイル名を付けたいのですが。具体的には以下の通りです。 最終的にはexcelに取込み処理するので、excelのマクロかDOS系でできるとあり難いです。 [file1.txt] 1111111111 2222 33333333 [file2.txt] 123 1234 ↓ [all.txt] file1.txt 1111111111 file1.txt 2222 file1.txt 33333333 file2.txt 123 file2.txt 1234

  • 沢山のテキストファイルを一つに

    下のように、Testフォルダに Area1、Area2・・・とフォルダがあり、 その中に、Sample.txtがあります。 C:\Test\Area1\Sample.txt C:\Test\Area2\Sample.txt C:\Test\Area3\Sample.txt ・ ・ ・ C:\Test\Area30\Sample.txt それぞのフォルダのSample.txtは "1234567890.123" "2345678901.234" "3456789012.345" . . . のように、数桁の数字が数百行並んでいます。 例えば、 Area1\Sample.txt に100行、 Area2\Sample.txt に200行、 Area3\Sample.txt に150行あるとします。 これを、 1~100行にArea1\Sample.txtの内容を、 101~300行にArea2\Sample.txtの内容を、 301~450行にArea3\Sample.txtの内容を、 として、Area30までのSample.txtを並べた 一つのテイストファイルに書き直したいのですが、 何しろ沢山あるので、一つ一つ開いてコピぺでは、 書き落としなども心配ですし、毎回大変時間が掛かります。 簡単に並べて書き出す方法はないでしょうか。 Excel等を使ってできないでしょうか。 宜しくお願いします。

  • テキストファイルを一行づつとる方法

    テキストファイルを一行だけとる方法は以下のとおりかと思いますが、最後の列まで一行づつとる場合はどうすればいいのでしょうか?教えて頂ければ幸いです。 Open "c:\data.txt" For Input As #1 Line Input #1, str Close #1

  • vbsでテキストファイル検索してファイルに書き込む

    初心者です。 テキストファイルを以下の条件で検索して、検索がマッチしたらそのファイルのレコード行を各条件によって指定されたファイルに書き込みたいです。 1)5桁目が"D"且つ 10~11桁目が"A5"の場合、ファイル"TEXT1.txt"に書き込む 2)5桁目が"G"且つ10~11桁目が"B6"の場合、ファイル"TEXT2.txt"に書き込む 3)上記に該当しない場合、ファイル"TEXT3.txt"に書き込む どなたかご教示のほど宜しくお願い致します。

  • ExcelVBAを使ってシートの行の情報をテキストファイルに書き込みたいのですが...

    ExcelVBAを使ってシートの行の情報をテキストファイルに書き込みたいのですが... (とりあえず、一行分をテキストファイルに書き込みたいです) 色々なサイトを見ても難しそうなことが多く書いてあったので、上記のような例でサンプルを使って(なるべくシンプルな形で)ご教授していただける方がいらっしゃればお願いいたします。

  • オープンしたファイルで行の連結

    はじめまして、言語に疎いもので質問させて頂きます。 次のようなsample.txtというファイルがあります。 【sample.txt】 ABC #1行目 <タブ>DEF #2行目 行頭にタブ <タブ>GHI #3行目 行頭にタブ JKL #4行目 <タブ>MNO #5行目 行頭にタブ PQR #6行目 <タブ>STU #7行目 行頭にタブ <タブ>VWX #8行目 行頭にタブ (・・・以下上記のような2、3行のブロックパターンがランダムで続く) 1~3行目を1ブロック、また4~5行目、6~8行目を一部ロックとして 半角スペースを間に挟んで一行に連結し、下のように別ファイルに出力したいと考えております。 【output.txt】 ABC DEF GHI JKL MNO PQR STU VWX ファイル自体は次のようにopen関数で開き、一行ずつ読み込んでいますが、現在の行を読みつつ、 次の行の内容をどうしたら読むことができるかわかりません。 また行の連結はどのように行えばよいでしょうか。 2、3行のブロックパターンがランダムで続くため、次の行の先頭にタブがあれば連結するという 処理も加えたいと考えております。 open(IN, $sample.txt); while (<IN>) {    $line = <IN>; } 質問内容もわかり辛いかと思いますがご教授頂けますでしょうか。

    • ベストアンサー
    • Perl
  • perlのopen()で+<を使用した時の挙動が変

    open()で+<を使用すると読み書き両方ができると 理解しましたが、書き込んだ後の結果が 私が思っていた挙動と違っていました。 例えば、 ---test.pl-------------------------- open(FILE,'+<test.txt') or die "$!"; my $line=<FILE>; print FILE "ABC\n"; close(FILE); ---test.txt---- 123 456 789 --------------- を実行すると ---test.txt---- 123 ABC 789 --------------- となることを期待していましたが実際には ---test.txt---- 123 456 789 123 ABC ---------------- となっていました。 1行だけ読み出したときのファイルポインタ は2行目の先頭を指しているように思われますが なぜこのような結果になるのでしょうか。 (Windows7,ActivePerl)

    • ベストアンサー
    • Perl
  • 同じ番号のデータを別のファイルにはきだだすには?

    下の画像のようのデータを一行一行みていき、先頭二桁が上の行と同じ場合それを同じファイルに一行一行はきだしたいです。 例 3,4,5行目は3.txt ファイルにはきだす。6.7行目は2.txtファイルにはきだす。その他は1.txtファイルにはきだす。 シンプルでわかりやすい方法を教えていただきたいです。 よろしくお願いいたします。

  • 【Ruby】テキスト置換を1ファイル完結にしたい

    memo.txtの中に含まれている"俺の飯"という文字列を"私のごはん"というふうに置換を行いたいのですが、 現在のやり方だとファイルを開いて1行ずつ読み込んで新しいファイルに文字列を書きだしており 読み込んだ際、置換対象の文字列があった場合に置換して書きだしておりますが このやり方だとどうしても新規ファイルを出力しなければいけません。 これを新規ファイルを作らずにmemo.txtの中身だけを書き換えるようにするには どのような処理にすれば良いのでしょうか? 何卒宜しくお願い致します。 ---- sample.rb require 'rubygems' open("memo.txt"){ |f| open("after_memo.txt","w"){ |o| while line = f.gets line.gsub!("俺の飯", "私のごはん") o.puts line end } } -- memo.txt 俺の飯はリーズナブル! 俺の飯美味しそう!

    • ベストアンサー
    • Ruby