• 締切済み

perlでファイル内を検索

perlでファイル内を検索して読み込みを行いたいのですが どのようにすればよいでしょうか。 環境は、Solaris10 以下のようなファイル(test.txt)から  #start1~#endの間にある、”01:”で始まっている値をすべて取得する。  複数行になっている場合、カンマで1つにする。  ”01”ではじまっていないものは無視する。#などで始まっているものも。 ●ファイル:test.txt #start1 01:abc,aaa,bbb 01:1234 #01;a1,b1,c1 02:(省略) 03:(省略) #end #start2 01:(省略) 02:(省略) 03:(省略) #end #start4 01:(省略) 02:(省略) 03:(省略) #end ●結果 abc,aaa,bbb,1234 として読み込みたい。

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

みんなの回答

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

Perl のバージョンによるけど my @data; open FH, '<', 'test.txt'; while (<FH>) { chomp; if (/^#start1/.../^#end/) { push @data, $1 if /^01:(.*)/; } print join(',', @data), "\n"; のような感じでできんか?

999xyz
質問者

お礼

ありがとうございます。 こちらも上手くでくました。 カッコ”}”が1個たりませんでした。

  • okmotokun
  • ベストアンサー率59% (92/155)
回答No.2

No.1 です。 すみません。PHPコードで回答しちゃいました。 あらためて回答します。 open(TXT,"file2.txt"); while(<TXT>){ last if($start&&/^#end/); if(/^#start1/){$start=1;next} next if(!$start); if(/^01:(.+)/){ if($match&&$match!~/,$/){$match.=','} $match.=$1; } } close TXT; print $match;

999xyz
質問者

お礼

ありがとうございます。 上手くできました。

  • okmotokun
  • ベストアンサー率59% (92/155)
回答No.1

$fh=fopen("text.txt","rb"); while($line=rtrim(fgets($fh))){ if($start&&$line=='#end')break; if($line=='#start1'){$start=1;continue;} if(!$start)continue; if(preg_match("/^01:(.+)/",$line,$str)){ if($match&&!preg_match("/,$/",$match))$match.=','; $match.=$str[1]; } } fclose($fh); print $match;

999xyz
質問者

補足

ありがとうございます。 試してみたのですが、エラーがでます。 Bareword found where operator expected at ./tst.pl line 7, near ")break" (Missing operator before break?) Scalar found where operator expected at ./tst.pl line 14, near ")$match" (Missing operator before $match?) syntax error at ./tst.pl line 7, near ")break" syntax error at ./tst.pl line 9, near ";continue" syntax error at ./tst.pl line 11, near ")continue" syntax error at ./tst.pl line 14, near ")$match" syntax error at ./tst.pl line 18, near "}" Execution of ./tst.pl aborted due to compilation errors. #!/usr/bin/perl # $fh=fopen("test.txt","rb"); while($line=rtrim(fgets($fh))) { if($start&&$line=='#end')break; if($line=='#start1'){$start=1;continue;} if(!$start)continue; if(preg_match("/^01:(.+)/",$line,$str)) { if($match&&!preg_match("/,$/",$match))$match.=','; $match.=$str[1]; } } fclose($fh); print $match;

関連するQ&A

  • ファイル中の数行を抜き出す処理について(シェル)

    ファイルaaa.txtの2行目から4行目を抜き出し、 ファイルbbb.txtに格納する方法として、 sed -n '2,4p' aaa.txt > bbb.txt がありますが、 変数を使用し、 start=2 end=4 sed -n '${start},${end}p' aaa.txt > bbb.txt とすると、エラーが発生します。 どうすればよろしいのでしょうか。

  • perlで特定行から特定行までを抜き出しor置換

    perlで以下のようなことをしたいと考えています。 以下のことを、コマンドラインから「perl ~」という形で 実行したいのですが、どのよにすればよいでしょうか。 1.特定行から特定行までを抜き出し 2.特定行から特定行の範囲で文字列置換 例えば、次のようなテキストファイルがあったとします。 example.txt ================================== #START aaaa hogehoge test okok perl script #END ================================== 上記ファイルを読み込んで、 1.「#START」から「#END」の間に挟まれた行だけ抜き出し 2.「#START」から「#END」の間で、「test」を置換 のです。 sedで言うところの sed -e '/#START/,/#END/ s/YYYYMM/201603/g' test.txt をやりたいのです。

    • ベストアンサー
    • Perl
  • perlでのcsv形式のテキストファイルの変換

    perlを使用してcsv形式のテキストファイルを下記のように変換したいと思っています。 【変換前】 10, abc , def , ghi ,jkl    ----1行目 10, abc , def , aaa, bbb   ----2行目 10, abc , def , ccc , ddd  ----3行目 11, abc , def , eee , fff   ----4行目 11, abc , def , aaa , ggg ----5行目 11, zzz , def , aaa , ggg  ----6行目 12, abc , def , aaa ,ggg ----7行目 12, zzz , def, aaa , ggg   ----8行目 【変換後】 10, abc , def , ghi ,jkl    ----1行目 11, abc , def , eee , fff   ----4行目 11, zzz , def , aaa , ggg  ----6行目 12, abc , def , aaa ,ggg ----7行目 12, zzz , def, aaa , ggg   ----8行目 変換内容はcsv形式のテキストファイルで、”,”で区切った先頭3列が 前の行の先頭3列と同じならその行は出力しない、といった 変換をしたいと思っております。 (例えば2行目ですと先頭3列は10, abc ,defになっており、  1行目の先頭3列と同じ文字列になっているためこの行は出力しない) 当方、Perl初心者で上記のようなことがPerlでできるかも よくわかっておりません。 そこで、上記のような変換はPerlで可能なのか、そしてもし可能であるのなら どのようにPerlで記述すればできるのか教えていただけないでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • Perl 先頭行に追加

    恐れ入ります。 Perlで、配列がカンマで区切られたデータを読み込み、 その先頭行にデータを挿入したいのですが、 中々うまくいきません。 データ(/data/xxx.txt)の中身は、 test,test2 bbb,bbb2 ccc,ccc2 という感じで、カンマで区切られて改行で並んでいます。 そこに新たに$dateと$contで受けたデータを先頭行に追加する感じです。 open(FILE,"<./data/xxx.txt"); while($temp = <FILE>){ @temp=split(/,/,$temp); push(@ddr,"$temp[0]","$temp[1]"); } seek(@ddr,0,0); unshift(@ddr,($date,$cont."\n")); open(FILE,">./data/xxx.txt"); $new=join(",",@ddr); print FILE $new; close(FILE); このように書いていますが、 print FILE @ddr とすると、配列が壊れた状態(全て繋がる)で先頭行には挿入されたのですが、カンマで区切って配列にして並べようとしたら、 test,test2 ,bbb,bbb2, ,,ccc,ccc2,, という感じで上手く並びません。 よろしくおねがいします。

    • ベストアンサー
    • Perl
  • 複数行になっている文字列を検索したい

    PERL初心者です。 以下、テキストに複数行になっている箇所の2行目の「BBB」を検索キーとして 3行目の「CCC」を取得したいのと2行目、3行目を1レコードにしたいのですが できません。 test.txt ---------------------------------- 1. AAA BBB CCC DDDD 2. AAA BBB 3. CCC DDDD 4. AAA BBB CCC DDDD ----------------------------------- 以上よろしくお願いします。

  • PERL カンマ区切り 一致行削除

    教えてくださいm(_ _)m 最初に目的を書きます・・・ ~test.txt~ 1,aaa,eee,ttt 3,eee,eee,yyy 5,ttt,yyy,eee 2,yyy,bbb,qqq ↓ 5,ttt,yyy,eee 2,yyy,bbb,qqq ~~~~~~~~~~ 例1)、カンマ区切り3列目が「eee」 の行を全て削除(完全一致) 例2)、カンマ区切り3列目が「e」を含む 行を全て削除(部分一致) というふうにしたいのですが、 どのようにするのかわからないです・・・ 現在下記のように とりあえず1行目(0番目)を削除するとこまできました。 #! /usr/bin/perl $TEST = 'test.txt'; open(FILE, "<$TEST"); eval{ flock(FILE, 1) }; @DATA = <FILE>; close FILE; $NO = 0; splice @DATA, $NO, 1; open(FILE, ">$TEST"); eval{ flock(FILE, 2) }; print FILE @DATA; close FILE;

    • ベストアンサー
    • Perl
  • ファイルのデーター削除

    下記のデーターが入っているabc.txtのファイルから 初めの2行を削除したいのですがよろしくお願いします。 10,aaa,100 11,bbb,200 12,ccc,200 13,ddd,300

    • 締切済み
    • PHP
  • Perlでのファイル一括読み込み

    Perlにてファイルの一括読み込みを以下記述で実施しております。 実行環境はAIXです。 ------------------------------- #!/usr/bin/perl open(FH,"/tmp/filename1.txt"); @aaa=<FH>; close(FH); print "@aaa\n"; ------------------------------- 上記内容をWindows XPにて実行した場合、何も表示されません。 print文が動いていないのか、ファイルの読み込みができていないのか不明です。 ファイルのパスは以下のように変更しております。 ------------------------------- open(FH,"C:\filename1.txt"); @aaa=<FH>; close(FH); print "@aaa\n"; ------------------------------- Windowsにて動作するようにはどのようにすれば宜しいのでしょうか? 初歩的な質問かもしれませんが、宜しくお願い致します。

    • ベストアンサー
    • Perl
  • perlで指定範囲を複数ファイルに分割する方法は?

    お世話になります。 perlを使用して、 下記の元ファイル[infile.txt]よりstart~endの範囲を各テキストファイルに 分割出力する方法をご教授いただけないでしょうか。  ※出力ファイル名は元のファイル名 (infile) + 1行目の文字列(単語)にします。   例>>infile_1111.txt , infile_333.txt よろしくお願いいたします。 [infile.txt] aaaa bbbb start 1111 2222 end dddd eeee start 3333 4444 end

  • dosでサイズを比較して異なるファイルだけコピー

    dosで全フォルダ内のファイルサイズを比較して異なるファイルだけコピーしたい 次のようなファイル構成で AAAフィルダ    BBBフォルダ  cccフォルダ    cccフォルダ   abc.txt      abc.txt   def.jpg      def.jpg  dddフォルダ    dddフォルダ   ghi.txt      ghi.txt   jkl.jpg      jkl.jpg AAA\ccc\abc.txtとBBB\ccc\abc.txt AAA\ccc\def.jpgとBBB\ccc\def.jpg AAA\ddd\ghi.txtとBBB\ddd\ghi.txt AAA\ddd\jkl.jpgとBBB\ddd\jkl.jpg 拡張子は問わずそれぞれに対するファイルのファイルサイズを比較して 大きくても小さくても異なるファイルだけbbbフォルダ内に上書きコピー したくご教授をお願いします