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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonにおける単方向リストの実装について 4 2022/07/13 12:34
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- UNIX・Linux cronの@rebootでのdateコマンドの実行につきまして 2 2023/06/11 16:23
- Visual Basic(VBA) VBA シート上にドロップダウンリストを作り、予め指定値をセットしたいのですが 1 2023/03/25 15:15
- Ruby パイソンエラーについて 1 2022/12/24 14:07
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perlのflock関数でロックをかけ...
-
fopenでディレクトリ内の全ファ...
-
バッチファイルの作り方(CSV→...
-
vba dir の相対パス
-
DOSコマンドで、標準出力を出力...
-
batファイルでrenameができませ...
-
VBAコードを張り付け後のエクセ...
-
CGIから外部コマンド実行時の標...
-
log2の「正確な」計算方法
-
複数ファイルを1つにするシェ...
-
外部サーバーにあるファイルを...
-
shellのコマンド deffの差分の...
-
VBAでCSVファイルの特定行を書...
-
MATLAB グローバル変数の宣言
-
ListBoxのデータを高速でファイ...
-
Perlで空白行を削除
-
Perlでファイルの末尾から指定...
-
openした後、closeしないでプロ...
-
ADOによるCSVファイルからのデ...
-
Perlで特定行から特定行までを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
close()で例外が投げられる理由
-
perlのflock関数でロックをかけ...
-
改行コードが勝手に
-
open中のファイルをrename
-
ファイルから読み込んだ文字を
-
perlでファイル内の文字列を置...
-
AutoCADのスクリプト
-
Perl で syntax error
-
perlを用いた特定文字列間の抽...
-
テキストファイルの本文中に行...
-
Perlで他サイトの情報を取得し...
-
オープンしたファイルで行の連結
-
PICでFatFsでオープンした内容...
-
パスワードを外部ファイルから...
-
Perl:ファイルハンドルをスカラ...
-
巨大ファイルの行をを逆順に並...
-
ハッシュにファイルハンドル
-
Perlのファイルオープン時...
-
パイプをopenして/usr/bin/grep...
-
telnet接続
おすすめ情報
ご指摘ありがとうございます。
$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の表示になってしまいました...。