みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

投稿日時 - 2012-07-11 16:05:42

QNo.7584420

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

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

投稿日時 - 2012-07-11 23:11:24

お礼

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

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

投稿日時 - 2012-07-12 10:41:02

ANo.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;

投稿日時 - 2012-07-11 19:37:20

お礼

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

投稿日時 - 2012-07-12 10:40:01

ANo.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;

投稿日時 - 2012-07-11 17:14:54

補足

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

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:08

あなたにオススメの質問