• ベストアンサー

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

質問者が選んだベストアンサー

  • ベストアンサー
noname#60992
noname#60992
回答No.2

全件デリートが早いからといって、読み込みが早いと判断できないと思います。 質問の趣旨から外れていると思いますが、ちょっと実験してみました。 参考になれば幸いです。 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を分けるのに効果が ありそうな気がしますが、残念ながら実験できる環境がありません。

bssspo
質問者

お礼

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

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

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

bssspo
質問者

お礼

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

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

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

bssspo
質問者

お礼

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

関連するQ&A

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

  • CSVファイルをテーブルにインポートする

    1行目が項目名のCSVファイルをテーブルにインポートするため Private Sub CSVインポート_Click() DoCmd.TransferText acImportDelim, , "ブランド", "J:\ブランド.TXT" MsgBox ("CSVファイルインポート完了") End Sub を実行すると、f1,f2のフィールドがありませんとメッセージがあり F1,F2 のフィールドを追加し再度実行するとデータは f1,f2に入り 項目名もデータとして入っています。 1行目は項目名と宣言する設定はありますか。 よろしくお願いいたします。

  • SQLサーバーにcsv.ファイルをインポート

    ACCESSデータベースをSQLサーバーへアップサイジングに挑戦しています。 csvファイルの取り込みについて質問させてください。 Accessでは、 DoCmd.TransferText acImportDelim, "○○インポート定義", "○○データ読込", filepath として、インポートしていました。 アップサイズ後、同じようにインポート定義を設定しようと思ったのですが、 ウイザードで設定できないのです。( 設定ボタンがグレーアウトしている。) それで、インポート定義なしでやってみたところ、 文字列フィールドで"00001"の表記が、すべて0が消えて"1"になってしまいます。 インポート後のテーブルのデータ型も、nvarcherになっているのですが・・ 正しいデータ型でインポートするにはどうすればよいでしょうか? よろしくお願いいたします。

  • Access2000のCSVファイルのインポートについて

    Access2000でCSVファイルをインポートしようと思っています。 インポート方法は、VBAで 「DoCmd.TransferText acImportDelim, , "テーブル名", "ファイル名"」を使用しています。 この時に、CSVファイルが次のようなデータです。 F1,F2,F3 0010,0200,0001A12 0011,0201,0021B12 (実際は、1000件近いデータです) これをインポートすると、 F1,F2,F3 10,200,1A12 11,201,21B12 となってしまいます。 頭の「0」を省きたくないのです。 文字列として取り込めないでしょうか? CSVのデータに""を自動でつける方法はないでしょうか? Accessの外部データの取り込みを使うと、文字列として指定できるのですが、VBAを使いワンクリックでデータを取り込もうとしています。 よろしくお願いします。

  • AccessでSQL結果を直接csvに書き出すには?

    Access2003,WinXP お世話になります。 自作のSQLを書いて、結果をTransferTextで手軽にCSVにできないかと考えてこんなのを書いてました。 Dim strSql AS String Dim strPath AS String strSql = 自作SQL文 strPath = c:\test.csv Docmd.TransferText acExportDelim, , strSql, strPath, True しかし、TransferTextでは「テーブル」か「クエリ」名を直接書くように指示してあり、これだと動かない?んでしょうか。 SQLは300個くらい出力する必要があるため(クエリ300個作れば解決するのですが・・・)上のようなコードをループして動かしたいのですが、何か他の簡単な出力方法があるのでしょうか。 よろしくお願いいたします。

  • Access VBAでファイルのインポートについて

    あるディレクトリにAccessのmdbファイルを置き、「インポート」フォルダを隣に置きます。 このフォルダ内にCSVファイルを置き、それをVBAでテーブル「tbl_import」にインポートさせたいのです。 ちなみにインポート後はディレクトリ「インポート」下層のディレクトリ「インポート済」に移動させたいのです。 下記例文では「file.csv」と書いていますが、このファイル名はインポートの都度、常に変わります。 インポートさせるファイルは常に一つです。 「*」を用いれば出来ると思っていたのですが、うまくいきません。 良い方法を教示いただけませんか。 DoCmd.RunSQL "DELETE * FROM tbl_import" DoCmd.TransferText acImportDelim, "インポート定義", "tbl_import", CurrentProject.Path & "\インポート\file.csv", True FileCopy CurrentProject.Path & "\インポート\file.csv", CurrentProject.Path & "\インポート\インポート済\file.csv" Kill CurrentProject.Path & "\インポート\file.csv"

  • AccessのマクロでCSVファイルをインポートする

    Accessのマクロ・VBAにてCSVファイルを インポートしたいのですが、うまくいきません。 DoCmd.TransferText acImportDelim, , "C:\Documents and Settings\yoshimi\My Documents\顧客マスタテーブル.csv", False 現在のコードです。 「オブジェクト'0.txt’が見つかりませんでした。 オブジェクトが存在していること、名前やパス名が正しいことを確認 してください。」 とエラーが表示されます。 過去ログを検索し、似たようなものを見つけ同じようにしたつもりです。 http://okweb.jp/kotaeru.php3?q=1691138 (回答のANo.1の定義の保存場所が分からずしていません) どこがおかしいのか教えていただきたいです・・・

  • MS AccessでExcelファイルのインポートは?

    AccessのVBAでExcelファイルをインポートするにはどうすればいいのでしょうか? ちなみに DoCmd.TransferText acImportDelim, , "Tmp名簿", strInPutPath & "\名簿.csv", True (strInPutPathは、ダイアログから取得したパスです) では、CSVファイル(TXTファイル)しか読み込めません。 (もちろん、そのため拡張子が「.csv」にしていますが 読み込むファイルをテキストファイルにしたら「.txt」でもいいです) 「ファイル」メニュー(コマンド)の「外部データの取り込み」→「インポート」では、Excelファイルも読み込めるので悔しいです。 これをVBAでやりたいんですが。 よろしくお願いいたします。

  • Access2007 の SQL文です。

    宜しくお願いします。 DoCmd.RunSQL ("update 予算月別 inner join 予算実績 on 予算月別.科目ID=予算実績.科目ID " _ & " set 合計金額 =sum(当年予算) where (月度>=開始日) and (月度<=終了日) group by 科目ID; ") これで 実行時エラー '3137': SQL ステートメントの最後には、セミコロン(;)が必要です。 下記のSQL文は実行できました。 これを編集したものです。 DoCmd.RunSQL ("update 予算月別 inner join 予算実績 on 予算月別.科目ID=予算実績.科目ID " _ & " set 金額01 =当年予算 where 月度=開始日 ; ")

  • ACCESSのテーブルへCSV形式のファイルを

    お世話になります。 ブランドテーブルへJドライブのルート内のCSV形式のファイルをインポートのため Private Sub インポート_Click() DoCmd.TransferText acImportDelim, , ブランド, j: ブランド.TXT End Sub で実行すると このアクションまたはメソッドを実行するには、「TableName/テーブル名因数が必要です。 とメッセージが帰ってきます。 これが解決すると インポートするCSVファイル6個ですが、ワンクリックで終わります。 宜しくお願いします。

専門家に質問してみよう