- ベストアンサー
ファイルから文字列(英単語)を比較して数える
- ファイルから文字列(英単語)を比較して数えるプログラムを組む方法
- ファイルXから単語を読み取り、ファイルYでその単語が何回出現したかチェックするプログラムの作成方法について
- ファイルを読み込んで比較するプログラムを組む方法、ファイルXとファイルYの単語の重複を取り除く方法について
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
1対nマッチングを応用してもできるのではないかと思います。 まず、前提として、 1.1行に重複していない1英単語だけのファイルを「xxx.txt」とします。 2.1行に重複している可能性のある1英単語だけのファイルを「yyy.txt」とします。 3.上記2つのファイルの英単語は昇順に並んでいるものとします。 4.「xxx.txt」と「yyy.txt」の両方にある英単語については「英単語と出現件数」を出力します。 5.「xxx.txt」だけにある英単語については「英単語と出現件数(結果として0)」を出力します。 6.「yyy.txt」だけにある英単語については何も出力しません。 7.4と5での出力ファイルを「zzz.txt」とします。 とします。 上記の前提で作成したのが以下のサンプルです。 --------------------------------------------------------------------------------- # ファイルのオープン open(IN1,"xxx.txt"); #マスターファイル open(IN2,"yyy.txt"); #トランザクションファイル open(OUT1,">zzz.txt"); #出力ファイル # 初期値設定 $high_value = pack("h8","ffffffff"); #終了判定 $in1_key = undef; #マスタキー $in2_key = undef; #トランザクションキー $occur_ctr = 0; #出現回数 # 1件目のデータ入力 s_in1(); s_in2(); # 主処理 until ($in1_key eq $high_value && $in2_key eq $high_value) { # マッチングの時(両方のファイルにデータがある) if ($in1_key eq $in2_key) { until ($in1_key ne $in2_key) { $occur_ctr++; s_in2(); } $out1 = join("\t",$in1_key,$occur_ctr); print OUT1 "$out1\n"; s_in1(); $occur_ctr = 0; } # マスタオンリーの時(マスタファイルだけにデータがある) elsif ($in1_key lt $in2_key) { $out1 = join("\t",$in1_key,$occur_ctr); print OUT1 "$out1\n"; s_in1(); } # トランザクションオンリーの時(トランザクションファイルだけにデータがある) elsif ($in1_key gt $in2_key) { s_in2(); } } # マスタファイル入力 sub s_in1 { if ($line1 = <IN1>) { chomp($line1); $in1_key = $line1; } else { #マスターファイルが終了のとき $in1_key = $high_value; } } # トランザクションファイル入力 sub s_in2 { if ($line2 = <IN2>) { chomp($line2); $in2_key = $line2; } else { #トランザクションファイルが終了のとき $in2_key = $high_value; } } # ファイルのクローズ close(IN1); close(IN2); close(OUT1); --------------------------------------------------------------------------------- ※なお、カラムをそろえるために、全角スペースを使っていますので、 このままコピー・ペーストしても動作しません。この点はご注意ください。
その他の回答 (4)
- Tacosan
- ベストアンサー率23% (3656/15482)
「連想配列にキーが存在するかどうか」を判定するなら, 一般には defined より exists の方が適切です>#4. defined を使うと「値が存在しない」場合だけでなく, 「値が undef である」場合にも偽になります. これに対し exists なら前者の場合のみ偽になります. もちろん今の場合には「値が undef であるようなキー」を作らないからどっちでも同じことだし, もっとはっきり言えば「そもそも definedness の判定すら不要」だったりしますが.
お礼
何度も回答ありがとうございます。色々試してみようかと思います。ありがとうございました。
- kmee
- ベストアンサー率55% (1857/3366)
この例で連想配列(ハッシュ)使うときに注意するのは「Yにだけ存在する単語」の時ですね。 $h{key}で、連想配列にkeyが無い時は未定義値になるので、definedで判定できます。
お礼
回答ありがとうございます。試行錯誤しながら頑張ってみます。
Xの各行を読み込んでいき、連想配列(ハッシュ)のキーにする。値は0。 Yの各行を読み込んでいき、その行の単語をキーにして連想配列の項目を指定し、値を1加算。 最後に連想配列全体を出力。 これが一番わかりやすい方法です。 やろうとしていることのレベルを考えると、プログラムを全部教えてしまったら意味がないので書きません。 連想配列について調べてください。 https://www.google.com/search?q=Perl+%E9%80%A3%E6%83%B3%E9%85%8D%E5%88%97
お礼
回答ありがとうございます。連想配列について勉強してみます。ありがとうございました。
- Tacosan
- ベストアンサー率23% (3656/15482)
十分なメモリがあるなら ファイルY から単語を読み込んで出現回数をハッシュで記憶し, ファイルX の単語と突き合せる のが単純かな.
お礼
回答ありがとうございます。連想配列について勉強してみます。ありがとうございました。
お礼
回答ありがとうございます。連想配列について勉強し、どうしてもできなかった時に参考にさせて頂きます。わざわざプログラムまで書いて頂いてありがとうございました。