電子書籍の厳選無料作品が豊富!

テキストファイルを読み込んで、以下のルールに従った文字列だけを.txtで出力するプログラムを書いています。
具体的にはテキストファイル中の
"text":"★★★","to_user"
で囲まれている★★★の部分のみを抽出したいです。
そこで正規表現に触りだしたのですが、表現がうまくいっていないようで1週間ほどはまっています。。うまく出力できるように直しをいただけないでしょうか。
打ち明けてしまうと、★★★の部分はtwitterの呟き(日本語)になります。
以下がそのソースになります。よろしくお願いします。


print "Input file name: ";
$ifname = <STDIN>;

open(IN, $ifname);
open(OUT, "> out.txt"); #出力ファイル
while(<IN>){
if($ifname =" m/"test":(.*?),"to_user"/;
next if($_ eq "");
print OUT "$_\n"; #書き出し
}
close(OUT);
close(IN);

A 回答 (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);
    • good
    • 0
この回答へのお礼

お返事が遅くなってしまって申し訳ありません。
手直しありがとうございます。参考にさせて頂きました。
自身のスキルアップにも、プログラミングの勉強に精進したいと思います。

お礼日時:2012/01/02 21:14

正規表現で無く、プログラムの問題です。



初心者であれば、すこしずつ確かめながらプログラムを書くのがいいでしょう。

ステップ1:
ファイルから読み込んだデータを無条件に全件書き出す。
(ファイルの入出力の仕方を学ぶ)

ステップ2:
正規表現を /(.*)/ つまり「すべてにマッチする」 にした状態で、マッチした部分を書き出す。
結果的には全件書き出しですが。
(正規表現のプログラムの中での使い方を学ぶ)

ステップ3:
望みの処理。
(正規表現を学ぶ)

今のプログラムは、ステップ1の直前くらいでしょうか。
    • good
    • 0
この回答へのお礼

お返事が遅くなってしまって申し訳ありません。
進行をステップにわけていただいて、現状が把握できました。
プログラミングの勉強を重ねていきたいと思います。
ご回答ありがとうございました。

お礼日時:2012/01/02 21:14

> 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...を使います。
    • good
    • 0
この回答へのお礼

お返事が遅くなってしまって申し訳ありません。
細かく丁寧なご回答ありがとうございました。
今一度プログラミングから、勉強し直してみます。

お礼日時:2012/01/02 21:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!