• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:読込んだファイルの指定行をカンマ区切りで出力したい)

perlで複数行のデータから特定の行をカンマ区切りで出力する方法

このQ&Aのポイント
  • perlを使用して、複数行のデータから特定の行をカンマ区切りで出力したい場合、文字列のマッチングを試しても期待する結果が得られないことがあります。
  • 代わりに、正規表現を使用してマッチングを行うことができます。特定のパターンに一致する行を抽出し、カンマで区切った形式に変換することで、目的の出力を得ることができます。
  • 以下のようなコードを使用することで、目的の出力を実現することができます。 ``` open(my $file, '<', 'ファイル名') or die $!; while (my $line = <$file>) { if ($line =~ /特定のパターン/) { $line =~ s/特定のパターン/置換する文字列/; print $line; } } close($file); ```

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

いくらでも方法はあります。 例えば。 「行の先頭にある[XXXX] の中を取り出し、 XXXX , の置換する」 と考えれば s/^\[([^]]*)\]/$1,/ ※ \[ と \] の間にある 0個以上の[^]] (]では無い文字。[^の直後の場合、]をエスケープしなくても大丈夫) を () でグループ化 ※ 置換内容は、$1で先にグループした部分を引用 となります。 なお、置換に失敗したときは偽になるので、置換に成功した行だけ出力すればよいので、 print OUT if( s/^\[([^]]*)\]/$1,/ ) ; で十分です。 Perlの正規表現は強力で、いろんなことができます。 正規表現そのものもそうですが 「どうやったら目的のものを得られるか」、いくつかのパターンを覚えておくとよいでしょう。 http://perldoc.jp/docs/perl/5.16.1/perlretut.pod http://perldoc.jp/docs/perl/5.14.1/perlre.pod

atwebhgtdre
質問者

お礼

ありがとうございました。おかげさまで期待通りの結果を出力することができました。 perl自体初めてでしたので戸惑うことが多かったのですが、丁寧に解説していただきそれぞれの記号が持つ意味、正規表現の仕方の一端を理解することができました。 今後もperlを使用する場面が少なからずあると思うので、地道に勉強していきたいと思います。 今回は本当にありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

具体的にどうやってだめだったのでしょうか? 例えば。 /[2013/07/10 00:00:00]/ みたいにしようとすると。 ○[]は、「その中にある文字のうちのどれかにマッチ」という表現になるので、[という文字自体にはマッチしない ○ この場合 / は正規表現の区切りに使われているので、 / という文字列にマッチしない となります。特殊な文字(メタ文字)は、\を付けると、その特殊な意味を失います /\[2013\/07\/10 00:00:00\]/ また、区切りは、変更できます m|\[2013/07\/10 00:00:00\]| http://perldoc.jp/docs/perl/perlop.pod#Regexp32Quote-Like32Operators

atwebhgtdre
質問者

補足

早速の回答ありがとうございます。 マッチについてはまさにその部分で躓いておりました。ご助言いただいたことを参考に下のようなスクリプトをかいてみました。 open(IN,"in.txt") or die "失敗"; open(OUT,">out.txt") or die "失敗"; while (<IN>){ print OUT if /---/; print OUT if /\[/ | s/[\[\].・]//g; } close(IN); close(OUT); 結果:out.txt ---あああああああああああああ---------------- 2013/07/10 00:00:00 ええええ 2013/07/10 00:00:01 おおおお しかし、この記述の仕方では当然ながらカンマ区切りで出力することはできません。[が含まれる行だけを抽出して配列に格納し、それぞれ必要な要素に分割して出力しようとしましたが、記述の仕方等問題がありエラーになってしまいました。 そのあたりの方法についても教えていただければ幸いです。

すると、全ての回答が全文表示されます。

関連するQ&A