• 締切済み

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

みんなの回答

  • cz611cgy
  • ベストアンサー率56% (190/338)
回答No.2

#1です > データが15~30万件ほどあり > DB:MS-ACCESS2000 この時点で色々な意味で厳しいです 当のMicrosoft自身が複数ユーザでの利用や大量データで使う場合 MS-Accessは推奨しない、そういう場合のためにSQLServerがあると言っています 勘違いされるかもしれないので補足しますが、DBMSとして問題が大きいのであって フロントエンド(フォームやレポートでDB上のデータを表示したり印刷)として使う分には有りと思います ・現在: DBMS(MS-Access200)→フロントエンド(MS-Access200) ・推奨: DBMS(Access以外)→フロントエンド(MS-Access200) 自分は過去に色々有ってフロントエンドとしても絶対に使いませんが... > やはりインポート定義を指定したTransferTextメソッドが早いという事でしょうか? どうしてもMS-AccessをDBMSとして使いたいという場合、私にはわかりません ただし、フロントエンドとして使うという事で有れば他のDBMSにインポートして Accessからはリンクテーブル(昔の記憶からです、今は呼び方が違うかも)として参照します 予算が厳しいという場合でもMySQLやPostgreSQL等、MS-Accessより安定した DBMSが有りますから、そういう物で代用します MS-Access用のODBCドライバ等も揃っていますから検討されてはどうでしょう? こういった感じで移行できますが、環境構築や文字コード、型の違いなどではまるのも目に見えていそうな... http://oshiete1.goo.ne.jp/qa1810819.html http://oshiete1.goo.ne.jp/qa3282664.html http://oshiete1.goo.ne.jp/qa2952024.html でも、MS-AccessのMDBにデータを保存していると行詰るのも早いので 大量データを扱い続けたいのでしたら移行をお勧めします データベースの最適化と修復が常に必要なDBMSは、恐ろしいです

参考URL:
http://oshiete1.goo.ne.jp/qa49288.html
全文を見る
すると、全ての回答が全文表示されます。
  • cz611cgy
  • ベストアンサー率56% (190/338)
回答No.1

コードの断片から想像するにVBあたりでしょうか? 仕事柄、速度優先する案件が殆どなのでVB(や.NET)は使う事もなく的外れかもしれませんが^^ どのようなデータベースを使われているか不明ですが大量ですので MS-Accessという事は無いという前提で^^ Microsoft自体が大量データを入れちゃいかんという見解ですから^^ まともなデータベースシステムであればテキストファイルからのインポート ユーティリティが付属しています。 そのユーティリティをシステムコールで呼び出すのが一番高速です 例: oracleの「imp」コマンド 番外編として、質問者の環境で使えるかどうか不明ですがテキストドライバを 経由して表に見せかける事も可能ですが、あまり早く無いと思います インポート用のファイルはデータベース毎に微妙な書式の違いが出てしまうため 大昔に汎用性を持たせるためにDelphiで自作しましたが、メーカー純正の ユーティリティの速度では勝てません 最終的には各DBに合わせた書式へ変換するためのプログラムを間に挟む 事にしました 例: 日付型をインポートする際に「YYYY-MM-DD」「YYYY/MM/DD」「YYYYMMDD」のように受け入れ可能な物がばらばらだった ユーティリティの起動オプションで対処可能な場合も有りますが 各データベースの標準的な書式(オプション無しで取り込める)に合わせるのが 一番問題が少ないと思います 参考までにメーカー純正のユーティリティでは速度を稼ぐために 色々なオプションが有ります 良く検討してから使わないと、落とし穴にはまるかもしれませんので慎重に^^ 例: キー重複時の動作、インデックスを含めた制約の反映タイミング等

参考URL:
http://www.microsoft.com/japan/technet/scriptcenter/scripts/misc/text/mstxvb06.mspx
bssspo
質問者

補足

os:windows2000, DB:MS-ACCESS2000 です。記入漏れしていました。 >そのユーティリティをシステムコールで呼び出すのが一番高速です やはりインポート定義を指定したTransferTextメソッドが早いという事でしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

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

  • 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になっているのですが・・ 正しいデータ型でインポートするにはどうすればよいでしょうか? よろしくお願いいたします。

  • VBAのSQLについて

    ACCESS2003のVBAでSQLを行うときは一度クエリを作り 、SQLビューで表示されるSQLを貼り付けると上手く行くと聞いたので試してみたのですがうまくいきません。多分、条件式の文が間違えていると思いますので、その部分を貼り付けて見ました。 「”」と「’」の使い方が原因だと思うのですが? "WHERE (((T不備対応.ふりがな) Like " * " & [Forms]![F不備一覧]![txt申込者名検索] & " * "));" DoCmd.RunSQL Sql お分かりになる方ぜひとも教えていただけないでしょうか?

  • 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でやりたいんですが。 よろしくお願いいたします。

  • データ削除とSQL*Loaderでのインポート

    SQL*Loaderを使ってデータをインポートするのですが、既存データが存在するテーブルにインポートするため、実行前に、条件に一致する一部のデータを削除します。 ですが、SQL*Loaderでインポートが失敗した際には、元に戻したいと思っています。 そういう場合に、SQL*PlusからDELETEのSQL文を実行してから、SQL*Loaderを起動してインポートするとなると、SQL*Plusから抜けた時点でCOMMITされてしまいますよね?そのためSQL*LoaderでインポートがエラーになってROLLBACKされても、削除されたデータは元に戻らないですよね・・・。 全件削除なら、CTLファイル内でREPLACEを指定してインポートするのですが・・・ データの一部削除とSQL*Loaderでのインポートを一連の処理として、エラーの際にはROLLBACKさせられる方法はありますでしょうか? よろしくお願いします。

このQ&Aのポイント
  • プリンター設定に問題があり、エラーメッセージが表示されています。
  • MFC-J7300という製品のプリンター設定に関するトラブルについて相談しています。
  • お使いのパソコンはWindows10で、USBケーブルで接続されています。ひかり回線を使用しています。
回答を見る