- ベストアンサー
Perlを使った正規表現によるテキストファイルの特定文字列抽出
- Perlを使用してテキストファイルから特定の文字列を抽出するプログラムを書いています。具体的には、テキストファイル中で"text":"★★★","to_user"で囲まれた部分のみを抽出します。
- しかし、正規表現の表現がうまくいっていないため、1週間以上も詰まっています。正しく出力するための修正方法を教えていただけないでしょうか。
- なお、★★★の部分はtwitterの呟き(日本語)になります。ソースコードは以下の通りです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
手直しを希望とのことなので直しました。 ファイル名を毎回入力するのは面倒ですから、第一引数から取るようにしてあります。 Windows環境では入力ファイルをドラッグ&ドロップすれば動作すると思います。 #!/usr/bin/perl use strict; # ファイル名を設定 my $ifname = shift or die "第一引数にはファイル名が必要です\n"; my $ofname = "out.txt"; #出力ファイル # ファイルを開く open(IN, $ifname) or die "入力ファイルを開けません"; open(OUT, ">", $ofname) or die "出力ファイルを開けません"; # データを処理 while(<IN>){ if(my($text, $message, $to_user) = m/"(.+?)":"(.+?)","(.+?)"/){ print(OUT "$text => $message, to $to_user\n"); } } # ファイルを閉じる close(OUT); close(IN);
その他の回答 (2)
- notnot
- ベストアンサー率47% (4900/10359)
正規表現で無く、プログラムの問題です。 初心者であれば、すこしずつ確かめながらプログラムを書くのがいいでしょう。 ステップ1: ファイルから読み込んだデータを無条件に全件書き出す。 (ファイルの入出力の仕方を学ぶ) ステップ2: 正規表現を /(.*)/ つまり「すべてにマッチする」 にした状態で、マッチした部分を書き出す。 結果的には全件書き出しですが。 (正規表現のプログラムの中での使い方を学ぶ) ステップ3: 望みの処理。 (正規表現を学ぶ) 今のプログラムは、ステップ1の直前くらいでしょうか。
お礼
お返事が遅くなってしまって申し訳ありません。 進行をステップにわけていただいて、現状が把握できました。 プログラミングの勉強を重ねていきたいと思います。 ご回答ありがとうございました。
- kmee
- ベストアンサー率55% (1857/3366)
> if($ifname =" m/"test":(.*?),"to_user"/; なんか文法的にむちゃくちゃなんですけど。 ・正規表現の対象にするには =~ です。 ・if ( $ifname = "XXXX") みたいになっていたのをコピーするとき間違えたようにも見えます。 しかし、$ifname = "XXXX"は $ifnameに"XXXX"を代入する(そして全体で"XXXX"をという値になる)というものです。 比較はしません。また、文字列との比較に==は使えません。 > next if($_ eq ""); $_はここでは<IN>で読み込んだ文字列になっています。 <>では改行がそのまま残ります。よって、$_ eq ""にはなりません。 > print OUT "$_\n"; #書き出し $_については上記のとおり m//は単に正規表現と一致するかどうかをチェックするだけのものです。 元の文字列の変更はしません。よって、入力がそのまま出力されます。上記の通り改行文字込みなので、1行おきに表示されることでしょう。 正規表現内()で括った部分を参照するには$1,$2...を使います。
お礼
お返事が遅くなってしまって申し訳ありません。 細かく丁寧なご回答ありがとうございました。 今一度プログラミングから、勉強し直してみます。
お礼
お返事が遅くなってしまって申し訳ありません。 手直しありがとうございます。参考にさせて頂きました。 自身のスキルアップにも、プログラミングの勉強に精進したいと思います。