WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:二つのファイルの比較

0:[投稿] ユキ [2004/11/11 02:50 ][環境:UNIX UNIX,Apache,CGI,perl ]

はじめまして、ユキといいます。

質問なんですが、二つのファイルを比較して
同一行を出力するやり方を教えて頂けないでしょうか?

まだperlは初心者なのですが、perlスクリプトで
それを行いたいと思っています

openファイルA読み込み
openファイルB読み込み
openファイルC出力

while(変数A=ファイルハンドラA)

  while(変数B=ファイルハンドラB)
  {
      if(変数A==変数B)
      {
         PRINT ファイルハンドラC"変数A"
       }
   }
 } 

イメージとしてはこんな感じでファイルAの一行目とファイルBの一行目からマッチングさせて等しいものがあればファイルCに出力
と考えていましたが、
全然出来ませんでした・・・
しかも、実際行いたいデータは数万件のものなので、
配列ではなくwhileで一行一行比較した方がよさそうです・・

どなたか教えて頂け無いでしょうか。
私の勉強不足と言われればそれまでですが、
よろしくお願い致します。


1:[回答] B-Cus [2004/11/11 03:02 ]

ファイル A の n 行目と比較するのはファイル B の n 行目だけで
よい (前後の行と比較する必要はない)、という仕様ですか?


2:[質問] ユキ [2004/11/11 16:46 ]

ご回答有難う御座います。

いえ、、、仕様としましては

ファイルA
あああ
いいいいい
ううう

おおお

ファイルB
かかかか
あああ
けけ
きききき
ううう

この2ファイルありましたら
まずはファイルAの一行目の「あああ」を
ファイルBの一行目から最後まで比較して、
マッチしたらファイルCに出力したいです。。。

これでいくと、結果は

ファイルC
あああ
ううう

にしたいです。。。

すみません、、


3:[質問] ユキ [2004/11/11 16:47 ]

まちがって投稿を押してしまいました。。。

もしよろしければ、アドバイス頂けたらと思います。
以上ですが、よろしくお願い致します。


4:[回答] B-Cus [2004/11/11 17:45 ]

では以下のような感じでよいでしょう。

openファイルA読み込み
openファイルC出力

while(変数A=ファイルハンドラA)

  openファイルB読み込み
  while(変数B=ファイルハンドラB)
  {
      if(変数A==変数B)
      {
         PRINT ファイルハンドラC"変数A"
       }
   }
  closeファイルB
 }

ただしこれでは一万回ファイル B をオープンしなおすわけで、遅いです。
もしその遅さが問題になるようなら以下のような感じで、最初に配列に
突っ込んでおけばよいでしょう。

openファイルB読み込み
while(変数B=ファイルハンドラB)

  配列に格納
 }

openファイルA読み込み
openファイルC出力

while(変数A=ファイルハンドラA)

  foreach (変数B=配列)
  {
      if(変数A==変数B)
      {
         PRINT ファイルハンドラC"変数A"
       }
   }
 }

これでも遅いならファイルBの内容をハッシュに突っ込んで…などの
方法もあるでしょうが、まぁそれは実際に遅かった場合に検討してください。


5:[回答] B-Cus [2004/11/11 17:46 ]

>  foreach (変数B=配列)
foreach 変数B (配列)

でした。


6:[回答] ユキ [2004/11/12 01:21 ]

ありがとう御座います!!
出来ました!!

ただ、これで解決なのですが、
いまいち理由がよくわかりません・・・

私がやってるのとの違いは、
openファイルB読み込み

closeファイルB
の場所だけですよね?
一番最初でopenしちゃうといけないのでしょうか?

もし、お時間がおありでしたら、ご回答よろしくお願い致します。
大変申し訳ないです・・


7:[回答] 森田 [2004/11/12 12:41 ]

ファイルBをファイルAのループの外でopenするならば、
ループ内の最初にseekして、ファイルの入力位置を
初期化すれば良いかと思います。
そうしないと、2回目のループ移行でファイルハンドラB
は常にEOFを返すようになってしまいます。

# ディスク読み込みのキャッシュが十分効くようなら配列に
# 入れなくとも良いのかな...?


8:[質問] ユキ [2004/11/13 00:21 ]

ご回答ありがとう御座います!

ちょっと参考書を見たところ、
一万件とかを超えるリストファイルを読み込む時は
配列だと危ないと聞きました、
ある程度の数だと配列でもいいらしいのですが・・・

すみません、勉強不足です・・

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World