• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:連想配列で時間短縮したい)

連想配列を使って時間短縮する方法

このQ&Aのポイント
  • 二つのファイルからデータを取得し、連想配列を使用して時間短縮する方法を解説します。
  • 従来の方法ではループが多く時間がかかる問題を、連想配列を使って解決することができます。
  • 連想配列を使えば、データの一致を高速に検索することができるため、効率的なプログラムが作成できます。

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

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

あなたがつくられたスクリプトをできるだけ生かすようにして連想配列を つかったスクリプトを作成しました。 いかのようになります。 ------------------------------------------------------------- $csvfile1 = $ARGV[0]; $csvfile2 = $ARGV[1]; #$csvfile1全体を一気に読み込む open(DAT1, $csvfile1) || die $!; @lines1=<DAT1>; close (DAT1); #$csvfile2全体を一気に読み込む open(DAT2, $csvfile2) || die $!; @lines2=<DAT2>; close (DAT2); #$csvfile1から連想配列を作る foreach $line (@lines1){ chomp $line; @data = split(/,/,$line); $hash1{$data[0]} = $data[1]; } #$csvfile2から連想配列を作る foreach $line (@lines2){ chomp $line; @data = split(/,/,$line); $hash2{$data[0]} = $data[1]; } #以下$csvfile1のデータを元にして出力する処理 #$csvfile1の連想配列のキーだけを取り出す、そしてソートする @key1 = sort(keys(%hash1)); #取り出したキーを1つずつ処理する foreach $key (@key1){ #第1列目のデータが$csvfile1,$csvfile2の両方に存在するものだけ出力する if (exists($hash2{$key})){ print $key,",",$hash1{$key},",",$hash2{$key},"\n"; } } ------------------------------------------------------------- 尚、第1列目のデータが両方のファイルにあるものだけを出力しています。 例えば、aaa.txtの1行目 06011800, 5.3 の06011800がbbb.txtに無い場合は、そのデータは出力しません。 (逆のケースも同様です)

sasmostmilk
質問者

お礼

解決しました!ありがとうございました。

その他の回答 (4)

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

push は autovivification が効くので $ret->{$d[0]} = [$d[1]]; の代わりに push @{$ret->{$d[0]}, $d[1]; とできますな>#4. 結果として 2つの while ループはほぼ同一の形になったりする.

sasmostmilk
質問者

お礼

ありがとうございました!

回答No.4

Unix コマンドなら、 join -t, aaa.txt bbb.txt と、この処理に適したコマンドが既に存在しています。 両方のレコードにあるものを出力するとすると、 例えば、こんな感じでしょうか。 http://pastebin.com/xz9dPGXy 片方だけのものを出力して良いなら、 while (<$csv2>) {...} の中の else 側の処理をコメントにします。さらに、出力部分の、next の行をコメントにします。

sasmostmilk
質問者

お礼

ありがとうございました!

回答No.2

OSは何ですか?UNIX系でよいですか。 2つのファイルの1列目が同じ時だけ出力すれば良いのなら、 sort aaa.txt bbb.txt |gawk -F, '{if($1=time){print time, dat, $2};time=$1;dat=$2}' Perlがよければ上の行をPerlのsystem関数で実行してください。

sasmostmilk
質問者

お礼

ありがとうございました。便利なコマンドですね。

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

「連想配列などを使えば時間が短縮出来そうなのですが、よくわかりません」ってのは, 具体的には何がどう「よくわからない」んでしょうか? 一方にあって他方にはないデータをどうするかなど詰めるべき点はあるけど, 配列のハッシュなりハッシュのハッシュなりを使えばいいだけですよね.

sasmostmilk
質問者

お礼

ありがとうございました。

関連するQ&A