• ベストアンサー

ある行の検索とその前後の抽出

プログラミングの初心者です。いろいろ考えても、わかりませんでしたので、質問いたします。 今手元に秀丸で表示できないほど大量のデータが下記のように1列に文章が切り分けれられて入っています。 日本 にとって アメリカ は 重要 な 貿易 国 です 。 例えば、「重要」という語を起点にして、前後3列を抜き出したいのですが、このようなことは可能でしょうか。イメージとしては下記のようです。 にとって アメリカ は 重要 な 貿易  国  ウィンドウズの環境で、Perlは5.8を使っております。 どなたか、教えてくださると、幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.2

> このような感じで書いたのですが、同じ行に並べることができなかった それは、 > @lines = <>; で読み込んだ時点で、配列には改行込みで格納されているからです。 読み込み後に「 chop @lines; 」とすれば、改行無しのデータになります。 ただし、挙げられたコードでは、最初に全てのデータを読み込んでいますので、このままでは「秀丸で表示できないほど大量のデータ」は処理できないと思います。 以下のように、 必要な行だけデータとして持って、不要になった行は適宜読み捨てるようにした方が良いでしょう。 --- $keyword = "重要"; $before = 3; $after = 3; @lines = ('dummy'); # ダミーデータ。読み取りループの最初にshiftで消える for(my $i = 0; $i < $before + $after; $i++) { $line = <>; chop($line); push(@lines, $line); } while ($line = <>) { chop($line); shift(@lines); push(@lines, $line); if ($lines[$before] =~ /$keyword/) { print join("\t", @lines)."\n"; } }

hiromi310
質問者

お礼

アドバイス、ありがとうございます。2つの方法を試してみたいと思います!

その他の回答 (1)

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

配列 @lines に全部入っていることを前提にしていいなら for $i (3 .. $#lines-3) { print "@lines[$i-3..$i+3]\n" if $lines[$i] =~ /$keyword/; } という感じかなぁ. メモリに載りきらないというならちょっと工夫せにゃならんけど.

hiromi310
質問者

お礼

ありがとうございます。問題なくできました!! さらに、これを↓のようなレイアウトで一列に表示したいと思いました。 にとって アメリカ は 重要 な 貿易  国  このような感じで書いたのですが、同じ行に並べることができなかったのですが、なにか良い方法があるでしょうか。 $keyword = "重要"; @lines = <>; for $i (3 .. $#lines-3) { print "$lines[$i-3]\t$lines[$i-2]\t$lines[$i]\t$lines[$i+1]\t$lines[$i+2]\t$lines[$i+3]" if $lines[$i] =~ /$keyword/; }

関連するQ&A