• 締切済み

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 として読み込みたい。

みんなの回答

  • 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

専門家に質問してみよう