• 締切済み

(初心者です)二つのcsvファイルを比較、除外したい

現在、二つのメールアドレスのリストを扱っています。 (形式はcsv...というか、一行に一つのメールアドレスが書いてあるだけの簡単な形式です) ちなみにどちらも数十万件レベルの長大なものです。 二つのリストを仮に1、2としますと、 「1」にはA、B、C 「2」にはB、D というように一部重複しているのですが、 この二つのファイルから A、Cを含む「3」というファイルを書き出したいと思っています。 明日の朝までに作業を終えなければならず、 また職場のPC(Win)で制限が多いこともあり案が浮かばず、 幸いperlだけはインストールしてありましたので、 それで何とかならないかと思いこちらでご質問させていただきました。 どうかお知恵を貸していただければと思います。 カテゴリ違いでしたらご指摘いただけると助かります。 宜しくお願い致します。

みんなの回答

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

いろいろ方法があるけど, 効率を考えて普通は連想配列を使うかな. エラー処理を全部無視すると my %address; { open(my $fh, "<FILE1"); $address{$_} = 1 while <$fh>; } { open(my $fh, "<FILE2"); $address{$_} = 0 while <$fh>; } { open(my $fh, ">OUT"); while (my ($key, $val) = each %address) { print $key if $val; } } とか. 効率を全く無視していいなら my @remove; { open(my $fh, "<FILE2"); @remove = <$fh>; } { open(my $fh, "<FILE1"); open(my $out, ">OUT"); while (my $addr = <$fh>) { print $addr unless grep { $addr eq $_ } @remove; } でもいいけど. 連想配列を使う方法は応用が広いのでなれると便利です.

fugtat
質問者

お礼

お礼が遅くなりすみません。 ご回答有難うございました。問題は解決しましたが、ご回答は今後の参考にさせていただきます。

  • daijirow
  • ベストアンサー率0% (0/0)
回答No.2

適当なうえ試してないですが、多分こんな感じかと思います。 my $file1 = FILE1; #一つ目のファイル my $file2 = FILE2; #二つ目のファイル my $file3 = FILE3; #出力するファイル my %mailaddrs; open my $fh1, "<", $file1 or die; for my $line (<$fh1>) { $mailaddrs{$line} = 1; } close $fh1 or die; open my $fh2, "<", $file2 or die; for my $line (<$fh2>) { $mailaddrs{$line} = 1; } close $fh2 or die; open my $fh3, ">", $file3 or die; for my $mailaddr (keys %mailaddrs) { print $fh3 $mailaddr; } close $fh3;

fugtat
質問者

お礼

お礼が遅くなりすみません。 ご回答有難うございました。問題は解決しましたが、ご回答は今後の参考にさせていただきます。

  • Gizensha
  • ベストアンサー率34% (207/608)
回答No.1

# perlでないですが windows付属のsort, fcコマンドあたりで重複した行を取り除ける気がします。 perlで行うなら、取り込んだ行の内容をキーに連想配列に値をセットして、最後にまとめて取り出しを行うかと思います。

fugtat
質問者

お礼

お礼が遅くなりすみません。 ご回答有難うございました。問題は解決しましたが、ご回答は今後の参考にさせていただきます。

関連するQ&A