• ベストアンサー

二つのファイルを読み込み、一つのファイルへ出力を行うプログラム

初めて質問させていただきます。 専門学校にて以下のようなPerlの課題に取り組んでおります。初学者です。 ---------- 二つのファイルを読み込み、一つのファイルに出力を行う。但し、以下の条件で出力を行うこと。 (1)ファイルはすでにソートされているものとし、プログラム内でソートを行う必要はない。 (2)同じデータは一つしか出力しない。 ---------- 課題の意図としては、二つのファイルから一行ずつデータを読み込み、文字列比較をさせたのち、既出のもの(重複)は出力させない~みたいなことを求められています。 ---------- ■データ例 「A.txt(元データファイル)」 A00001 A00002 「B.txt(元データファイル)」 A00000 A00002 A00005 「C.txt(結果出力ファイル)」 A00000 A00001 A00005 ---------- まず、行き詰っているのは二つの元データファイルからデータを一行ずつ読み込み、比較する部分です。 関数で読み込ませ、if文で文字列比較するのはなんとなく分かるのですが、どう表現させてよいのかが、いまひとつ分かりません。 回答はじめ、ヒントとなる基本的な考え方を教えていただけると幸いです。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

課題をそのまま丸投げしちゃダメだよ~. せめて「こう考えたんだけど, どこが違うんでしょう」くらいにしておかないと~. 「文字列の比較」で詰まっているなら, そこを復習するように. eq とか ne とかですな. で, 2個の文字列 $a, $b があって「$a が $b より小さければ $a を出力する」なら if ($a lt $b) { print $a; $a = <A>; } のようになるはずですね ($a = <A>; は, $a を出力したあと次のデータを補充している). そこから先, 課題をそのままやると本質的にマージソート. 調べればいくらでも出てくると思うので省略. 正しいプログラマとしては極力手を抜きたいので, ハッシュを使うのが (メモリは使うけど) 簡単かと. つまり, map {$line{$_}++;} <A>; map {$line{$_}++;} <B>; とやると, ハンドル A, B から読み込んだ各行がハッシュ %hash のキーになるので, あとはそのキーをソートして出力する. ちなみに結果に A00002 がないんだけど, これは仕様?

craftmax
質問者

お礼

丁寧なご説明、ありがとうございます。 自分で考え抜けるように習慣づけたいと思います。 >ちなみに結果に A00002 がないんだけど, これは仕様? すみません。A00002は入力忘れです。

その他の回答 (1)

  • hira6bg
  • ベストアンサー率61% (8/13)
回答No.1

下記でどうでしょうか? 1)A.txt、B.txtを読み込みハッシュにつめる 2)ハッシュのキーをソートしつつ出力ファイルに出力 #!/usr/bin/perl my $DAT_A = "A.txt"; my $DAT_B = "B.txt"; my $DAT_C = "C.txt"; my %hash; open (IN_A, "$DAT_A") or die "FILE OPEN ERROR!! [ $DAT_A ]"; open (IN_B, "$DAT_B") or die "FILE OPEN ERROR!! [ $DAT_B ]"; while (<IN_A>){ chop $_; $hash{$_} = "ON"; } while (<IN_B>){ chop $_; $hash{$_} = "ON"; } open (OUT, ">$DAT_C") or die "FILE OPEN ERROR!! [ $DAT_C ]"; foreach $_ (sort keys(%hash)){ if(defined($_)){ print OUT "$_\n"; } }

craftmax
質問者

お礼

ご説明いただき、ありがとうございます。 ハッシュの復習に取り組みます。

関連するQ&A