- ベストアンサー
accessでSQL文を使ってcsvファイルをインポートする方法
txtファイルをDoCmd.TransferTextでインポートする事は出来ているのですが、データが15~30万件ほどありかなり時間が掛かります。SQL文でのレコード全件DELETEがかなり高速だった為、インポートもSQLの方が処理が早いのでは?と思い色々サンプルをさがし、下記のようにしてみたのですが、SQL文をうまく書けず、作動しません。 間違い部分を指摘していただけませんでしょうか? DoCmd.RunSQL "INSERT INTO Add_house_TEMP ( ハウス,カスト,SG1ステータス )"& _ "SELECT [add_house#txt].F1,[add_house#txt].F2,add_house#txt].F3"& _ "FROM add_house#txt IN "\\sv999999\_営業部\個人\作業場\20071115" "Text;HDR=NO;"
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
全件デリートが早いからといって、読み込みが早いと判断できないと思います。 質問の趣旨から外れていると思いますが、ちょっと実験してみました。 参考になれば幸いです。 Private Sub コマンド0_Click() Dim sTime As Date Dim eTime As Date Dim strFileName As String strFileName = "C:\test.txt" sTime = Now() DoCmd.TransferText acImportDelim, , "T_Temp", strFileName, False eTime = Now() Debug.Print (eTime - sTime) * 24 * 60 * 60 End Sub Private Sub コマンド1_Click() Dim sTime As Date Dim eTime As Date Dim strFileName As String Dim strSQL As String strSQL = "SELECT * INTO T_TEMP FROM T_TEMP1" strFileName = "C:\test.txt" sTime = Now() DoCmd.TransferText acLinkDelim, , "T_Temp1", strFileName, False DoCmd.SetWarnings False DoCmd.RunSQL strSQL eTime = Now() Debug.Print (eTime - sTime) * 24 * 60 * 60 End Sub Private Sub コマンド2_Click() Dim sTime As Date Dim eTime As Date Dim strFileName As String Dim strSQL As String Dim CON As New ADODB.Connection Set CON = CurrentProject.Connection strSQL = "SELECT * INTO T_TEMP FROM T_TEMP1" strFileName = "C:\test.txt" sTime = Now() DoCmd.TransferText acLinkDelim, , "T_Temp1", strFileName, False CON.Execute strSQL eTime = Now() Debug.Print (eTime - sTime) * 24 * 60 * 60 End Sub フィールド数188、18万件(355MB)のテキストファイルを読み込んでみました。 (毎回作ったテーブルを削除し、最適化をしてから行いました。) 5回ずつテストしてみましたが、体感できる差はなさそうです。 tranfertext と runsql は私のコンピュータでは65秒くらい、 ADOを使った場合は67秒くらいでした。 どちらかというと、物理的に読むHDと書くHDを分けるのに効果が ありそうな気がしますが、残念ながら実験できる環境がありません。
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
#1です。 >社の基幹システムより抽出してもらったデータを 普通は基幹システムからEUC用に渡すデータは、CSVファイルが多いように思いますが。 「社の基幹システムより抽出してもらったデータ」のファイル形式は何なのでしょうか。「.mdb」ですか。 標題から「csvファイルをインポートする方法」とあるから、渡されたとき、CSVファイルを加工する段階は許されているのでしょう。 >Dailyで処理する必要があり 私の言ったことは、デイリー作業だからできない理由にはならない。 >基幹システムへのアクセス権限無しの為 こういうのは常態であることは知ってます。しかし現にmdbには質問者が加工してる(許されている)ではないですか。 まあ質問者はそう素人では無いようなので、#2のご回答も出て、判断はできると思いますのでよろしく。 最近は内蔵メモリとか、HD入出力速度など大幅に多量化・高速化していて、各方法の差は思ったより少ないのかもしれません。 私はどちらかというと、CSV->CSvの方が判りやすいと思ったのです。
お礼
>普通は基幹システムからEUC用に渡すデータは、CSVファイルが多いように思いますが。 すみませんCSVファイルです。 >私の言ったことは、デイリー作業だからできない理由にはならない。 出来ないといったのではなく、数分でも短縮したいが為に他の方法も試したいのでした。SQL文にて試してみたところ、実行時間にほとんど差がありませんでした。 >こういうのは常態であることは知ってます。しかし現にmdbには質問者が加工してる(許されている)ではないですか。 基幹システム⇒関東圏内の顧客より料金引き落としする課金システム(ITC:大規模CATV事業者の使っている課金システム) MDB⇒各エリア局での取次店(代理店)への支払システム おかげさまで、SQL文によるインポートの試験が出来ました。 社のPCも機能面で??な部分がかなりあるので、PCを替えるという考えも有りかと思いました。 アドバイスありがとうございました。今後ともよろしくお願いいたします。
- imogasi
- ベストアンサー率27% (4737/17069)
正面からの答えでは無いが、 CSVファイルはシーケンシャルファイルで、どんなアクセスシステムで扱うにしても、30万件のデータを1度は読まなければならず、その時間は覚悟しなければならない。 そこでSQLといった複雑高等な仕組みを使わず、VB(A)などでCSVファイルを読み、IF文などで判別して、抜き出したCSVファイルを別ファイルで書き出すのが良いのでは無いでしょうか。1回30万件読み、最大30万件書き出し時間で終ります。 SQLは便利ですがSQL馬鹿(何でもSQL)にならないほうが良い。 上記のシーケンシャルファイルを扱うコードはWEBで多数見つかります。 http://www.k1simplify.com/vba/tipsleaf/leaf291.html など。
お礼
imogasi様 返信ありがとうございます。 上記の質問言葉が足りていませんでした。 業務上Dailyで処理する必要があり、社の基幹システムより抽出してもらったデータをACCESSに取り込んでいます。(基幹システムへのアクセス権限無しの為)抽出に45分ほど、インポートに10分ほどインポートされたデータの体裁を整えるのに15分ほど掛かってしまい、いい方法はないのか?と探っていたのでした。もちろん一番早くなければSQLは使いません。
お礼
おかげさまで色々と試験する事ができました。 ありがとうございました。