こんにちは。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番遅いなど、どれが効率的なのかよくわかりませんでした。
このような処理をしたい場合、みなさんはどのような方法で処理されますか?
上記以外の方法でも構いません。アドバイスよろしくお願いします。
No.1
- 回答日時:
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ファイル名)
ご回答ありがとうございます。
2が早そうですか。このチェックは、1秒毎に5回程度登録(CSV確認)し、その後1時間後にまた1秒毎で5回程度・・・の繰り返しです。できればAccessは使いたくないので、2でやってみようと思います。
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の文字列操作はとにかく遅いので、文字列操作処理を少なくするのが速くするこつだと思われます。
ご回答ありがとうございます。2はご指摘のとおりLine Inputで取って、instrでやっていました。Splitにかえてやってみたいと思います。
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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- その他(プログラミング・Web制作) データ解析ソフトRでのファイル入力read.csvがエラーになります 7 2022/03/27 22:11
- その他(プログラミング・Web制作) Pythonで、データファイルと列名ファイルを1つのファイルにしたいです。 1 2023/07/27 20:29
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Excel(エクセル) CSVファイルがカンマ区切りにならない。対処法を教えていただきたいです。 仕事でSMS一斉送信ができ 2 2022/07/01 21:24
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッファとは何ですか
-
【python】Excelファイルを読み...
-
Microsoft VBAで2GBを超えるフ...
-
ページ読み込み時に自動的にsub...
-
エンディアンと2の補数表現
-
バイナリ表示されたデータを小...
-
EXCEL VBAでテキストファイルの...
-
VBA バイナリ―から文字列にす...
-
入力ファイルをバイナリにする利点
-
VB2010 COMポートからのバイナ...
-
EOF
-
バイナリを16進数で表示したい
-
C言語とシリアル通信の送受信...
-
エクセルVBA 2千万行のCSVファ...
-
JPGのwidhtとheight
-
ワードプレスhtmlファイルの保...
-
コンピュータ系にはめっぽう弱...
-
ゲームのパラメータの読み込み...
-
3gp、mp4のファイル情報取得
-
fwriteでの書き込み
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッファとは何ですか
-
Microsoft VBAで2GBを超えるフ...
-
EXCEL VBAでテキストファイルの...
-
ページ読み込み時に自動的にsub...
-
エクセルVBA 2千万行のCSVファ...
-
VBA バイナリ―から文字列にす...
-
エラー:ストリームの終わりを...
-
入力ファイルをバイナリにする利点
-
バイナリエディタのつかいかた
-
MacからWinにファイルを添付す...
-
EOF
-
【python】Excelファイルを読み...
-
C言語の質問です。バイナリ形...
-
画像の保存方法。
-
テキストデータをSQLServerに取...
-
バイナリファイルの比較につい...
-
bitmap画像の保存がうまくいき...
-
なぜデータの整合性を確認する...
-
C言語とシリアル通信の送受信...
-
【Teraterm】filewritelnについて
おすすめ情報