- 締切済み
データの抜き取りとcsv出力
---- Frame 273 (126 bytes on wire, 126 bytes captured) Arrival Time: Dec 12, 2007 14:24:53.169702000 Last SR timestamp: 1840388505 (0x6db21999) Delay since last SR timestamp: 174981 (2669 milliseconds) ---- といった形式のデータの塊が1つのファイルに複数存在しているのですが、 このデータの中のArrival Time:,Last SR timestamp:,Delay since last SR timestamp:の値をそれぞれ抽出して、上記の例だとDec 12, 2007 14:24:53.169702000,1840388505 (0x6db21999),174981 (2669 milliseconds)といったようなcsv形式で1ファイル分のデータを出力させたいのですが、perl初心者なもので、手におえないでいます。 申し訳ありませんが、どなたか教えていただけないでしょうか。 よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- ralf124c
- ベストアンサー率52% (232/446)
とりあえず「<>が存在しない」「データの最後はかならずDelay」という条件付でならこんな感じ my $FN = 'ファイル名'; my $key1 = 'Arrival Time: '; my $key2 = 'Last SR timestamp: '; my $key3 = 'Delay since last SR timestamp: '; open(IN01,$FN); while(my $line = <IN01>){ ## データがそろうかEOFまで読み込み $line .= <IN01> while(!($line =~ /$key3/) and !eof(IN01)); ## データがそろっていると仮定して処理 if($line =~ /$key3/){ ## 改行置き換え $line =~ s/\r\n|\r|\n/<>/g;; my $arrive = $line; my $last = $line; my $delay = $line; ## キーワードから必要部分を抽出 $arrive =~ s/.*$key1([^<]+).*/$1/; $last =~ s/.*$key2([^<]+).*/$1/; $delay =~ s/.*$key3([^<]+).*/$1/; ## 表示部分 my $DT = sprintf("%s,%s,%s\n",$arrive,$last,$delay); print $DT; } } close(IN01); ただし、データの内容次第でつくりが違ってくるのでデータの条件をしっかり把握することが肝心です(順序が入れ替わるケースが無いかどうか、3種のうち欠ける物がないかどうかなど)。
- Tacosan
- ベストアンサー率23% (3656/15482)
「Frame」で始まる行がきたときに, 次の 3行を読み込んで処理する... だけかなぁ. 何も考えずに書くとこんな感じ? while (my $line = <>) { next unless $line =~ /^Frame/; my $arrive = <>; my $last = <>; my $delay = <>; $arrive =~ s/.*?:\s*//; $last =~ s/.*:\s*//; $delay =~ s/.*:\s*//; print "$arrive,$last,$delay\n"; }