![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
テキストファイルを読み込んで、以下のルールに従った文字列だけを.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);
No.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);
お返事が遅くなってしまって申し訳ありません。
手直しありがとうございます。参考にさせて頂きました。
自身のスキルアップにも、プログラミングの勉強に精進したいと思います。
No.2
- 回答日時:
正規表現で無く、プログラムの問題です。
初心者であれば、すこしずつ確かめながらプログラムを書くのがいいでしょう。
ステップ1:
ファイルから読み込んだデータを無条件に全件書き出す。
(ファイルの入出力の仕方を学ぶ)
ステップ2:
正規表現を /(.*)/ つまり「すべてにマッチする」 にした状態で、マッチした部分を書き出す。
結果的には全件書き出しですが。
(正規表現のプログラムの中での使い方を学ぶ)
ステップ3:
望みの処理。
(正規表現を学ぶ)
今のプログラムは、ステップ1の直前くらいでしょうか。
お返事が遅くなってしまって申し訳ありません。
進行をステップにわけていただいて、現状が把握できました。
プログラミングの勉強を重ねていきたいと思います。
ご回答ありがとうございました。
No.1
- 回答日時:
> 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...を使います。
お返事が遅くなってしまって申し訳ありません。
細かく丁寧なご回答ありがとうございました。
今一度プログラミングから、勉強し直してみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:12
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- その他(プログラミング・Web制作) atcoder python コードへの助言 2 2022/08/12 15:31
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストファイルで提出とは?
-
ファイルをディレクトリ分配の...
-
openした後、closeしないでプロ...
-
perlのプログラミング 部分入れ...
-
Perlのエラーについてご教授く...
-
画像が表示でnull; this.src
-
perlプログラミング 空白行削除
-
Perlで特定文字列から特定文字...
-
ラズベリーパイ初心者です。 ラ...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
-
Perlで時間の計算
-
perlについて
-
perlのrequireの動き方について...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
openした後、closeしないでプロ...
-
テキストファイルで提出とは?
-
INDIRECT 横に再度抽出したい
-
Perlで特定文字列から特定文字...
-
perlをバージョンアップしたら...
-
Wallpaper Engineでおすすめの...
-
arduino の割り込み処理について
-
アルファベットに付いて質問し...
-
Strawberry Perl for Windows ...
-
Perlで時間の計算
-
このファイルを開く方法で困っ...
-
TeraPadエディターの操作方法に...
-
cgiでサーバーにファイルを追加...
-
フローチャート 九九
-
LinuxにおいてのPerlのプログラ...
-
perl 初等プログラミングについて
-
Perlのエラーについてご教授く...
-
こんにちは ブラケッツでプログ...
-
bashスクリプト
-
perlプログラミング 空白行削除
おすすめ情報