perl初心者です。複数のファイルの処理について悩んでいます。
text-a
ab
ac
bc
text-b
a,1
b,2
c,3
とのような二つのテキストファイルで、
text-aの文字の中に、text-bの左の文字が含まれているとき
text-bの該当する文字の右側の数字を足して、text-aの右側に加えて書きだしたいです。
この例だと
ab 3
ac 4
bc 5
という風にしたいです。
open closeなどは省いています。text-aは実際は他にも情報があって、その分プログラムが多くなっていますが、$a1 = text-a の文字の部分になるようにしています。
while($str = <FILE_IN1>){
chomp($str);
@tmp = split(/\t/, $str);
@tmp1 = split(/,/, $tmp[0]);
@tmp2 = split(/,/, $tmp[1]);
$a1 = $tmp1[0];
while($str0 = <FILE_IN2>){
chomp($str0);
@tmp0 = split(/,/ , $str0);
@b1 = @tmp0[1];
@b2 = @tmp0[2];
if($a1 =~ /$b1/){$a2 += $b2;}}
print FILE_OUT1 "$a2,$a2\n";
}
というプログラムを書いたのですが、数字を足して書き出す部分が上手くいかず、何故よくないのかさえわからない状態です...。
ご教示お願いします。
No.4ベストアンサー
- 回答日時:
うん, そうなってるだろうなと思った.
内側の while ループの動きを考えてみよう. まず, text-a.txt の 1行目のデータに対して FILE_IN2 から全データを読み込むよね. その次, text-a.txt の 2行目のデータに対して FILE_IN2 からデータを読み込もうとするんだけど, FILE_IN2 からはもう全てのデータを読み込んじゃってるのでそれ以上読み込めないんだよ.
3行目以降も全部同じことなので「後は全て0の表示になってしまいました...。」という結果になる, と.
一度全て読み込むと、次に読み込むときは
またファイルを開かないといけないんですね;
whileの中にopenを入れてopenも繰り返すようにしないといけなかったのですね。
無事に正しい結果を出すことができました。
知識が浅い私に、根気強く丁寧に教えてくださり、ありがとうございました。
とても勉強になりました。
本当にありがとうございました。
No.3
- 回答日時:
本当にちゃんとできてるんだろうか....
open や close を含めたプログラムを見せてもらえませんか?
何度も、すみません。よろしくおねがいします。
use utf8;
use Encode qw/encode decode/;
open(FILE_IN1, "<:utf8", "text-a.txt") or die "Can't open file!";
open(FILE_IN2, "<:utf8", "text-b.txt") or die "Can't open file!";
open(FILE_OUT1, ">text-c.txt");
while($str = <FILE_IN1>){
chomp($str);
@tmp = split(/\t/, $str);
@tmp1 = split(/,/, $tmp[0]);
@tmp2 = split(/,/, $tmp[1]);
$a1 = $tmp1[0];
while($str0 = <FILE_IN2>){
chomp($str0);
@tmp0 = split(/,/ , $str0);
$b1 = $tmp0[0];
$b2 = $tmp0[1];
if($a1 =~ /$b1/){$a2 += $b2;}}
$a1 = encode('UTF-8',$a1);
$a2 = encode('UTF-8',$a2);
print FILE_OUT1 "$a1,$a2\n";
}
close(FILE_IN1);
close(FILE_IN2);
close(FILE_OUT1);
No.2
- 回答日時:
あ,
$b1 = $tmp0[1];
$b2 = $tmp0[2];
の添え字がたぶんおかしい.
あとは
・$a2 のクリアが書かれていない
・最後に表示するのは "$a2,$a2\n" でいい?
・ファイルの open, close はちゃんとできてるよね?
くらいかな.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パスワードを外部ファイルから...
-
サブスクリプトとのファイルハ...
-
巨大ファイルの行をを逆順に並...
-
perlでファイル内の文字列を置...
-
データファイルをプロットする(...
-
[arduino]数値の大きなデータを...
-
VBAでCSVファイルを途中行まで...
-
VBAで巨大なファイルの途中から...
-
データの日付でソートをしたい
-
(Perl)UTF-8で別ファイルに書き...
-
fopenでディレクトリ内の全ファ...
-
エクセルVBAで素数だけを出力す...
-
マクロ構文エラー
-
重複するデータを抽出できる秀...
-
ファイルのアップロード
-
フォルダ内のファイルを全て開...
-
perl system関数 引数 フォルダ
-
awk '{print $1}' file をもっ...
-
CGIがうまく動作しません。原因...
-
window.open でのファイル指定方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
close()で例外が投げられる理由
-
改行コードが勝手に
-
perlを用いた特定文字列間の抽...
-
open中のファイルをrename
-
巨大ファイルの行をを逆順に並...
-
perlのflock関数でロックをかけ...
-
ジョブショップスケジューリング
-
telnet接続
-
AutoCADのスクリプト
-
Perl で syntax error
-
perlで大容量CSVのsort方法につ...
-
オープンしたファイルで行の連結
-
アルゴリズム java お店の営業...
-
Perl変数から外部プログラムの...
-
クリックを何回もされて、重複...
-
IF文について
-
Perlで他サイトの情報を取得し...
-
GD.pmで作成した画像を保存する...
-
cgiの投票回数制限設定について...
-
ハッシュにファイルハンドル
おすすめ情報
ご指摘ありがとうございます。
$b1 = $tmp0[1];
$b2 = $tmp0[2];
の書き間違いです。
直すと、数字部分が全て1で表示されます。
よろしければまた教えてください。
何度も小さなミスをすみません...。本当にありがとうございます。
$b1 = $tmp0[0];
$b2 = $tmp0[1];
"$a1,$a2\n"
で修正しました。
open,closeは他のプログラムだと動いていたので問題ありません。
$a2のクリアは、二つ目のwhileの前に
$a2 = 0;
かなと思ってやってみたのですが、
次は$a2の表示が一番初めは1、
後は全て0の表示になってしまいました...。