アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。VB6.0(SP5)、Windows2000でVBの勉強をしています。
VBのテキストボックスに入力したデータをCSVファイルに保存する時、もうすでに登録されていたらエラーを出したいと思っています。
そこで、CSVファイルを読み込み、同じかどうか確認したいと思っていますが、どの方法で処理するのが早く効率的なのでしょうか。

ファイル形式・・・csvで50行×3列
-----------
aaa,1,2
bbb,3,4
・・・50行程度のデータ
-----------
テキストボックスに入力したデータ・・・例えば"ccc"

1.Open ファイル名 For Input As #fileNum でEOFまで読み、配列に入れ、その後1列目のデータが"ccc"かどうか確認する
2.Open ファイル名 For Input As #fileNum で読みながら、1列目のデータが"ccc"かどうか確認し、EOFまで繰り返す
3.DAOを利用し、SELECT文であるかないか確認する(DAO2.5)
の3つの方法を試してみましたが、あるパソコンで行うとDAOが早いのに別のパソコンだとDAOが1番遅いなど、どれが効率的なのかよくわかりませんでした。
このような処理をしたい場合、みなさんはどのような方法で処理されますか?
上記以外の方法でも構いません。アドバイスよろしくお願いします。

A 回答 (3件)

2.が一番早いと思います。



1.と2.は、1.が配列を回す分だけ遅くなります。
(ただし、そんなに変わらないと思いますが)

3.はよくわからないのですが、いったんCSVをMDBとかにインポートして、そこからSelectするということですよね?もしそうだとすると、Selectする分が余計なI/Oになるので、2.よりも遅くなると思います。

内部処理とI/Oを比べると、I/Oがたくさん出る方が当然遅くなりますので、I/Oをできるだけ減らすのがいいと思います。

なお、このチェックが恒常的なものであれば、CSVではなくテーブルにデータを格納して検索するようにした方がいいと思います。

この回答への補足

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

補足日時:2004/11/09 11:21
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/11/09 16:53

まず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の文字列操作はとにかく遅いので、文字列操作処理を少なくするのが速くするこつだと思われます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/11/09 16:55

以下のようなプログラムをつくり、実際に時間を


計ってみてはいかがでしょう?


'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
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/11/09 16:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!