• 締切済み

2つのCSVファイルをマッチング

ソート済みの2つのCSVデータをシーケンシャルマッチングし、お互いの不一致レコードと一致したレコードとをそれぞれ別ファイルに出力するwshを作成しました。 件数が多くなればなるほど、処理時間がかかってしまうようです。 シーケンシャルマッチング以外の方法で効率のよい方法はないでしょうか? 最近勉強を始めたばかりの初心者ですが、宜しくお願いします。

みんなの回答

noname#102340
noname#102340
回答No.3

2分探索法で検索されるといいかもしれません。

参考URL:
matarillo.com/algorithm/
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

#1です。もうひとつ#1を書いた後に心配したのは、テキストファイルを一旦エクセルシートに読み込んで処理し、書き出しもエクセルのシートに行っていないでしょうね。 これをやるとデータ行数が多くなると、テキストデータのデータをシートにセットする時間がかかると思います。 ソートもエクセルを使わないと、自作するかしかないのが現状かも知れないので、ひょっとして、エクセルを使ってないか心配したのです。 オフコンや大型コンのソフト群には、独立したオフライン実行用のソートマージプログラムは必ず付いていましたが、MS(エクセル・アクセス・VB)などはそういう考えではなく添付されてない。 またADOやその他仕組みのあるDBソフトのものは、仕組みの分だけ重くなる恐れはあると思う。 ーー マージのサンプル 質問はCSVファイルなので、下記そのままではうまく行かないだろう。キー項目を別変数にセットするなどして比較処理する必要があろう。 またハイバリュー999(下記ではキーが文字列で3桁数の文字列の例)はデータの有様によって変える必要がある。 更新は下記でe1のところで行うもの(略) 旧Basic的といったのは、こういうもの。 エクセルの標準モジュールで下記データでテスト済み。 コード Sub test01() Open "input01.txt" For Input As #1 Open "input02.txt" For Input As #2 Open "outpt02.txt" For Output As #3 bothread = "y" r1: If EOF(1) Then d1 = "999" GoTo cmp End If Input #1, d1 If bothread = "n" Then GoTo cmp bothread = "n" r2: If EOF(2) Then d2 = "999" GoTo cmp End If Input #2, d2 cmp: If d1 > d2 Then GoTo h1 If d1 = d2 Then GoTo e1 If d1 < d2 Then GoTo l1 h1: Print #3, d2 GoTo r2 e1: If d1 = "999" Then GoTo end1 Print #3, d2 GoTo r2 l1: Print #3, d1 GoTo r1 end1: Close #1 Close #2 Close #3 End Sub ーーーー input01.txt(文字列の例)メモ帳で作成 1 3 8 10 13 15 ーーー input02.txt メモ長で作成 5 6 8 9 13 16 17 20 ーーー 結果 メモ帳で確認 1 3 5 6 8 8 9 10 13 13 15 16 17 20

oxyukixo
質問者

お礼

imogasiさんありがとうございます。 エクセルは使っていません。 wshで作成しています。 readallで配列に読み込んでシーケンシャルマッチングを行っています。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

情報処理技術者の試験準備の学習書にアルゴリズムの項があって、そこに「マッチング」や「マージ」のことが載っています。 両ファイルがソートされておれば、両者のファイルを一読すると処理は終わるはずです。2ファイルの読み込みと結果ファイルの書き出しの時間しかかからないはずです。 これが一番シンプルな無駄の無いファイル処理だからです。 >シーケンシャルマッチングといっているが、コードが適当でないのではと思います。ファイルレコード数が非常に多いとか断片化したとしても我慢できないほどではないでしょう。 >件数が多くなればなるほど、処理時間がかかってしまうようです 原理的にミクロで考えれば当たり前です。 ーー コードが適当か(無駄が無いか)見直すべきと推測します。 できるだけ旧BASIC的なシンプルなVBコードでやってみてはどうでしょう。

oxyukixo
質問者

お礼

ありがとうございます。 ロジックを再度見直ししてみたいと思います。 シーケンシャルマッチング以外の方法も勉強のため知っておきたいと思い、質問させていただきました。ADOとかでも出来るようなのですが、何もわからないので、よければご指導お願いします。

関連するQ&A