• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBでCSVファイルを読み込む方法(最速方法は?))

VBでCSVファイルを読み込む方法(最速方法は?)

このQ&Aのポイント
  • VB6.0(SP5)、Windows2000でVBのテキストボックスに入力したデータをCSVファイルに保存する時、既存のデータと重複しているか確認する方法を教えてください。
  • 以下の3つの方法を試しましたが、効率的な方法がわかりませんでした。他にどのような方法がありますか?
  • ・Open ファイル名 For Input As #fileNumを使用して、EOFまで読み込み、配列に入れ、1列目のデータが重複しているか確認する方法 ・Open ファイル名 For Input As #fileNumを使用して、1列目のデータが重複しているか確認し、EOFまで繰り返す方法 ・DAOを利用し、SELECT文で重複しているか確認する方法

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

  • ベストアンサー
  • takasebou
  • ベストアンサー率42% (61/144)
回答No.2

まず1はデータを一度に読み込んで作業するならバイナリ形式で読んできた方が早いと思います。 1.2はデータの取込方法をどのようにしているかによりますが、 Line Input などで読んでいるなら、配列分割方法は Splitを使えば早いと思います(instrとMID$などを利用していたら遅いので)。 3.DAOで直接ファイル操作するって事ですか? DAOはアクセス相手には早いですが、CSVなどを操作するのには向かないような……。やるならADOの方が早い気がします。やったことないので推測ですが。 あと、SELECT分の書き方によっても速度が変わると思いますが、CSVだとIndexをはってる訳ではないので、そんなに早くない気もします。 たぶんとにかくスピードを優先するなら1の方法で、かつバイナリでデータを一気にとりこんだあとにバイト単位で処理するのが一番早いと思われますが……。ま、面倒かもしれません。いまいちVBチックではないですしね。 2は最近ディスクI/Oも早くなったので、さほど差はないかと思われますが、毎回ディスクアクセスする訳なので、それほど早くはないと思われます。 ただし 同じ for Input でよむなら、2の方が早いです。 でもこの辺りの処理ですが、VBの文字列操作はとにかく遅いので、文字列操作処理を少なくするのが速くするこつだと思われます。

izumi_charis
質問者

お礼

ご回答ありがとうございます。2はご指摘のとおりLine Inputで取って、instrでやっていました。Splitにかえてやってみたいと思います。

その他の回答 (2)

  • momoturbo
  • ベストアンサー率55% (49/88)
回答No.3

以下のようなプログラムをつくり、実際に時間を 計ってみてはいかがでしょう? 'OSが起動してからのミリSECを取得 Private Declare Function GetTickCount Lib "kernel32" () As Long Private Sub Command1_Click() Dim lngStart As Long Dim lngEnd As Long lngStart = GetTickCount Call 処理1 lngEnd = GetTickCount MsgBox lngEnd - lngStart lngStart = GetTickCount Call 処理2 lngEnd = GetTickCount MsgBox lngEnd - lngStart End Sub

izumi_charis
質問者

お礼

ご回答ありがとうございます。人間の感覚では曖昧ですよね。サンプルありがとうございます。やってみます。

回答No.1

2.が一番早いと思います。 1.と2.は、1.が配列を回す分だけ遅くなります。 (ただし、そんなに変わらないと思いますが) 3.はよくわからないのですが、いったんCSVをMDBとかにインポートして、そこからSelectするということですよね?もしそうだとすると、Selectする分が余計なI/Oになるので、2.よりも遅くなると思います。 内部処理とI/Oを比べると、I/Oがたくさん出る方が当然遅くなりますので、I/Oをできるだけ減らすのがいいと思います。 なお、このチェックが恒常的なものであれば、CSVではなくテーブルにデータを格納して検索するようにした方がいいと思います。

izumi_charis
質問者

お礼

ご回答ありがとうございます。 2が早そうですか。このチェックは、1秒毎に5回程度登録(CSV確認)し、その後1時間後にまた1秒毎で5回程度・・・の繰り返しです。できればAccessは使いたくないので、2でやってみようと思います。

izumi_charis
質問者

補足

早速の回答ありがとうございます。 3は、テキストをそのままDBのように扱ってSelectしています。 Set objDB = OpenDatabase(ディレクトリ名, False, False, "Text;DATABASE=" & csvファイル名)

関連するQ&A