- ベストアンサー
Perlを使用して2つのファイルから同じRecordのみ抽出する方法
- Perlを使用して2つのファイルから同じRecordのみ抽出する方法について相談です。
- ファイル1からの抽出対象はr1カラムのみで、ファイル2のr1と一致するRecordのみを抽出し、ファイル3に出力したいです。
- どうすれば効率的にこの処理ができるでしょうか。アドバイスをお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
なんでそんな「適当につけた意味のないもの」が存在するかなぁ.... ハッシュのキーが全く変わってないってことに気付かない? 「ハッシュを使う」というのはいいけど, 「どのようなハッシュを作るのか」つまり「何をキーにして何を値とするのか」はちゃんと考えた? なお「考えていない」という答えは却下. もし考えてないなら, ちゃんと考えてください. あとど~でもいいけど datas は変. data は複数形です (単数形は datum).
その他の回答 (3)
- tatsu99
- ベストアンサー率52% (391/751)
file1を最初に読み込みます。file1のr1がキーになります。 file2を読み込み、file2のr1が、file1のr1のハッシュに存在すれば、file3へ出力します。 以下のコードを実行してください。 ---------------------------- my %hash = (); #ハッシュテーブル(ファイル1の1カラムのデータ) open(IN,'file1'); while(<IN>){ chomp; #ハッシュテーブルへ登録 $hash{$_} = 1; } close(IN); open(OUT,'>file3'); open(IN,'file2'); while(<IN>){ chomp; #カラム8まで取り出す my ($r1,$r2,$r3,$r4,$r5,$r6,$r7,$r8,$r9) = split(/,/,$_,9); if (exists $hash{$r1}){ print OUT join(',',$r1,$r8),"\n"; } } close(OUT); close(IN); ----------------------------- 動作確認済みです。不明点があれば、質問してください。
お礼
上記内容にて思い描いた内容が採取できました。 他の方からもご指摘があったようにきちんとハッシュの使用方法を理解せずに使用したことが間違いの発端だと思います。 もうすこし自分自身で解決できるように勉強したいと思います。 ありがとうございました。
- Tacosan
- ベストアンサー率23% (3656/15482)
.... $acct って, 何? ちょっと気になったんですが ・カンマの前後の空白って意味を持つんでしょうか? ・今の場合, ファイル1 の方が短いので, そっちを先に読み込む方がいいと思います.
補足
Tacosanさん ・$acct って, 何? 上記は特に意味がありません。適当につけたものです。 ・カンマの前後の空白って意味を持つんでしょうか? 申し訳ありません。誤って空白が入っております。カラム部分は全てカンマ区切りです。 ・今の場合, ファイル1 の方が短いので, そっちを先に読み込む方がいいと思います 上記了解しました。メモリ使用量などを考慮すると少ない法を先に読み込んだ方が宜しいという事でしょうか。ファイルの読み込みを逆にしてみましたが下記Scriptですと結果は同じでした。 根本的に方法が間違っているのでしょうか。自身ではまったくわからないため、何かアドバイスを頂ければと思います。
- Tacosan
- ベストアンサー率23% (3656/15482)
「フィイル1にあるレコードのみファイル2から抽出したい」ということだけど, この例だと全然わかんないんだよね. でも, メモリが足りるのであれば 1. ファイル1 から読み込んでハッシュを作る 2. ファイル2 から読み込みつつハッシュにあったら出力する だけだよねぇ. 「うまく取り出せない」というのは ・どのようなコードで ・どのようにやって ・どう「うまく取り出せ」ていない のでしょうか?
補足
お世話になっております。 Tacosanさんのいうとおりの内容を実現したいと考えております。 下記コードで実施しているのですが出力されたfile3には$address_datas{$acct} = [$id, $ip]で取り込んだ最後のレコードだけが50,000行出力されておりました。 ハッシュの方法が悪いのか検索方法がわるいのか分からず試行錯誤しておりますが未だ解決できておりません。 他に何か必要なものがあればご連絡頂ければと思います。 お手数お掛け致しますが宜しくお願い致します。 #!/usr/bin/perl # 最初に、IDとIPをHashに取り込む my %address_datas = (); open(IN, 'file2'); while(<IN>){ chomp; my ($id, $a2, $a3, $a4, $a5, $a6, $a7, $a8, $ip, $a10, $a11) = split(/:/, $_, 12); $address_datas{$acct} = [$id, $ip]; } close(IN); # file2内にfile1のIDがあればfile3出力する。 open(OUT, '>file3'); open(IN, 'file1'); while(my $line = <IN>){ chomp($line); my $id = $line; my $ref_data = $address_datas{$acct}; my $login = $ref_data->[0]; my $ip = $ref_data->[1]; print OUT join(',', $login, $ip), "\n"; } close(OUT); close(IN);
補足
上記ご指摘ありがとうございます。ハッシュのキーについてはテスト的につけておりました。 きちんと最終的な形式まで考慮しなかったこと、そもそもハッシュの動作をきちんと理解せずに使用したことが間違いだったと思います。 安易にサンプルにあったものを内容を理解せずに使用しようとしたことが間違いでした。