Access VBAでCSVファイルをインポートする処理。早いのどっち?を検証。
VBAでインポートするのにも幾通りかの方法がありますが、どいつもこいつも速度的に満足していないので、より速いやつを探す旅に出てみようと思い立ち、
まずは「ADO」 vs 「DAO」のインポートプログラムで実行速度を比較してみました。
実験に使用したデータと処理の方法
「整形されたCSV」を使用
今回使用したデータは社内システムで吐き出されたもので、比較的整ったCSVを使用しました。
- 文字列項目は必ずダブルクォーテーションで囲まれている
- 行内のカラム数がすべての行で一定
- 文字列項目内にカンマは含まない
- 文字コードは"Shift_JIS"
というように、インポートする前に加工する必要がない、整ったデータで実験しました。
件数についてはもっとボリュームのあるデータで試したかったのですが、あいにく手に入らなかったため、190カラム、37万レコード、ファイルサイズ約380MBくらいのCSVファイルを実験材料としました。
ソースコード
DAOはDatabaseオブジェクトでSQLを実行する方法、ADODBはConnectionでSQLを実行するやり方で検証です。
業務で利用する場合は概ねデータ型の問題が付きまといます。型が思い通りにならない問題をクリアする為には1行ずつループさせて、該当する項目を型変換したりといった加工が必要になります。…が、今回は速度比較用に用意したcsvを使用する事で、データクレンジング的な要素は割愛しました。業務で利用したい方はその点ご了承ください。
DAOを使ってCSVをインポートするサンプル
参照設定は「Microsoft DAO x.x Object Library」にチェックを付けてください。
Public Sub ImportText_DAO()
Dim db As DAO.Database
Dim lsSQL As String
Dim lsPath As String
lsPath = CurrentProject.Path
Debug.Print "【DAO】"
Debug.Print "START:", Format(Now(), "hh:nn:ss")
Set db = CurrentDb
lsSQL = "SELECT * INTO T_TEST_DAO FROM [TESTDATA.csv] IN " & _
"'" & lsPath & "' 'Text;HDR=YES'"
db.Execute lsSQL
Debug.Print " END:", Format(Now(), "hh:nn:ss")
db.Close
Set db = Nothing
End Sub
Accessのローカルテーブル「T_TEST_DAO」に、同じフォルダにあるCSVファイル「TESTDATA.csv」を取り込んでいます。
ADOを使ってCSVをインポートするサンプル
参照設定:「Microsoft Active Data Object x.x Library」にチェック。
Public Sub ImportText_ADO()
Dim cn As ADODB.Connection
Dim lsSQL As String
Dim lsPath As String
lsPath = CurrentProject.Path
Debug.Print "【ADO】"
Debug.Print "START:", Format(Now(), "hh:nn:ss")
Set cn = CurrentProject.Connection
lsSQL = "SELECT * INTO T_TEST_ADO FROM [TESTDATA.csv] IN " & _
"'" & lsPath & "' 'Text;HDR=YES'"
cn.Execute lsSQL
Debug.Print " END:", Format(Now(), "hh:nn:ss")
cn.Close
Set cn = Nothing
End Sub
こちらは、テーブル「T_TEST_ADO」に、同じフォルダにあるCSVファイル「TESTDATA.csv」を取り込むサンプルです。
DAO、ADOともに、実行前にユーザーテーブルをすべて削除、テーブルがひとつもない状態にして、DBは最適化した上でテストしました。
通常なら「SELECT * INTO テーブル名」なんて書き方はせず、インポート先のテーブル、フィールドを指定した「INSERT INTO テーブル名 (フィールド, ...)」とするべきですが、データが上の3つの条件をクリアしている(文字列項目は必ずダブルクォーテーションで囲まれている&行内のカラム数がすべての行で一定&文字列項目内にカンマは含まない)場合のみ、正しくインポートできます。
比較した結果
結論:DAOとADOのインポート速度はほとんど同じみたいです
先に結論言っちゃうと、DAOもADOもどっちも同じでした。やれDAOは軽いだのADOは改良されてるだ言われてるけど、どっちを使ってもたいして変わらないって事!
実行結果はこちら。(表示は時刻です)
【DAO】
START:16:56:31
END :16:58:31
【ADO】
START:16:59:27
END :17:01:28
どちらも2分程度で完了しています。
DAO / ADOは好きな方使えばいいんだねって事で、
いささか乱暴でしたが、本日の実験報告は以上です。