きなこSHOW

自作プログラム置き場です。

Access VBAでCSVデータをインポートするサンプル。ADOとDAOの速度を比較した結果

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は好きな方使えばいいんだねって事で、
いささか乱暴でしたが、本日の実験報告は以上です。