電子書籍の厳選無料作品が豊富!

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

A 回答 (3件)

Perl のバージョンによるけど


my @data;
open FH, '<', 'test.txt';
while (<FH>) {
chomp;
if (/^#start1/.../^#end/) {
push @data, $1 if /^01:(.*)/;
}
print join(',', @data), "\n";
のような感じでできんか?
    • good
    • 0
この回答へのお礼

ありがとうございます。
こちらも上手くでくました。

カッコ”}”が1個たりませんでした。

お礼日時:2012/07/12 10:41

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;
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/07/12 10:40

$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;

この回答への補足

ありがとうございます。
試してみたのですが、エラーがでます。

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;

補足日時:2012/07/11 19:13
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!