プロが教えるわが家の防犯対策術!

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;"

A 回答 (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を分けるのに効果が
ありそうな気がしますが、残念ながら実験できる環境がありません。
    • good
    • 0
この回答へのお礼

おかげさまで色々と試験する事ができました。
ありがとうございました。

お礼日時:2007/11/22 17:01

#1です。


>社の基幹システムより抽出してもらったデータを
普通は基幹システムからEUC用に渡すデータは、CSVファイルが多いように思いますが。
「社の基幹システムより抽出してもらったデータ」のファイル形式は何なのでしょうか。「.mdb」ですか。
標題から「csvファイルをインポートする方法」とあるから、渡されたとき、CSVファイルを加工する段階は許されているのでしょう。
>Dailyで処理する必要があり
私の言ったことは、デイリー作業だからできない理由にはならない。
>基幹システムへのアクセス権限無しの為
こういうのは常態であることは知ってます。しかし現にmdbには質問者が加工してる(許されている)ではないですか。
まあ質問者はそう素人では無いようなので、#2のご回答も出て、判断はできると思いますのでよろしく。
最近は内蔵メモリとか、HD入出力速度など大幅に多量化・高速化していて、各方法の差は思ったより少ないのかもしれません。
私はどちらかというと、CSV->CSvの方が判りやすいと思ったのです。
    • good
    • 0
この回答へのお礼

>普通は基幹システムからEUC用に渡すデータは、CSVファイルが多いように思いますが。
すみませんCSVファイルです。
>私の言ったことは、デイリー作業だからできない理由にはならない。
出来ないといったのではなく、数分でも短縮したいが為に他の方法も試したいのでした。SQL文にて試してみたところ、実行時間にほとんど差がありませんでした。
>こういうのは常態であることは知ってます。しかし現にmdbには質問者が加工してる(許されている)ではないですか。
基幹システム⇒関東圏内の顧客より料金引き落としする課金システム(ITC:大規模CATV事業者の使っている課金システム)
MDB⇒各エリア局での取次店(代理店)への支払システム

おかげさまで、SQL文によるインポートの試験が出来ました。
社のPCも機能面で??な部分がかなりあるので、PCを替えるという考えも有りかと思いました。
アドバイスありがとうございました。今後ともよろしくお願いいたします。

お礼日時:2007/11/17 11:01

正面からの答えでは無いが、


CSVファイルはシーケンシャルファイルで、どんなアクセスシステムで扱うにしても、30万件のデータを1度は読まなければならず、その時間は覚悟しなければならない。
そこでSQLといった複雑高等な仕組みを使わず、VB(A)などでCSVファイルを読み、IF文などで判別して、抜き出したCSVファイルを別ファイルで書き出すのが良いのでは無いでしょうか。1回30万件読み、最大30万件書き出し時間で終ります。
SQLは便利ですがSQL馬鹿(何でもSQL)にならないほうが良い。
上記のシーケンシャルファイルを扱うコードはWEBで多数見つかります。
http://www.k1simplify.com/vba/tipsleaf/leaf291.h …
など。
    • good
    • 0
この回答へのお礼

imogasi様
返信ありがとうございます。
上記の質問言葉が足りていませんでした。
業務上Dailyで処理する必要があり、社の基幹システムより抽出してもらったデータをACCESSに取り込んでいます。(基幹システムへのアクセス権限無しの為)抽出に45分ほど、インポートに10分ほどインポートされたデータの体裁を整えるのに15分ほど掛かってしまい、いい方法はないのか?と探っていたのでした。もちろん一番早くなければSQLは使いません。

お礼日時:2007/11/16 14:55

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A