【ACCESS】インポート定義を使わないCSVインポート

このQ&Aのポイント
  • ACCESS VBAを使用してMDBにSQL文でCSVデータをINSERTする方法について教えてください。
  • CSVデータの型を正しくマッチさせる方法について、インポート定義を使用せずに実現できるか教えてください。
  • 現在、ACCESS VBAから他の言語への移行や複数のCSVファイルをインポートする場合、インポート定義の管理が難しい状況です。別の方法を教えていただけると助かります。
回答を見る
  • ベストアンサー

【ACCESS】インポート定義を使わないCSVインポート

ACCESS VBAにてMDBにSQL文でCSVデータをINSERTしようとしています。INSERT自体はうまくいったのですが、データの型をうまくそろえられません。2日程ネットサーフィンしているものの良いサンプルを見つけられません。有識者の方、ご存知でしたら是非教えてください! まず、CSVデータは以下のようなものです。 ===aaa.csv=== 00000001,2009/1/31 00000002,2009/1/31 ・ ・ A000001,2009/1/31 Z000002,2009/1/31 ========== これを 既存テーブル:aaa_TBLに取り込ませたく、以下のSQL文を書きました。 INSERT INTO aaa_TBL(カラム1,カラム2) SELECT FORMAT([aaa#CSV].F1,'0000000'),[aaa#CSV].F2 FROM aaa#csv IN 'C:\' 'Text;HDR=NO' これにて「0000001」と「000002」等のレコードは正常に取り込むことができましたが、「A000001」「B000002」等のデータは取り込まれず、NULLにて登録されておりました。 (aaa_TBL自体はカラム1=テキスト型、カラム2=日付型でCreateされております。) これを回避したく、いろんなサイトを訪問したのですが、ほとんどがインポート定義を使った方法を推奨しておりました。 しかしながら、私にはどうしてもインポート定義が理解できないんです! 「VBAにて○○.iniを作成する方法」などをよく見かけるんですが、できるだけ他の方法を検討したいと考えております。(今後、ACCESS VBAから他言語への乗り換えを考えているとか、他CSVにてインポートされるテーブルの数が30個程あるので、インポート定義ファイルの管理がつらいな・・・とか色々他にも理由はあるんですが・・・・) 何か良い方法はないでしょうか?! やはりインポート定義を作らないとだめでしょうか?! その場合、簡単なサンプルコードなどを頂けますと非常に助かります。。。(MSサイトのサンプルコードは理解できませんでした。。。) まだVBAを勉強し始めて2週間なので、色々突っ込みどころはあると思いますが、どうぞよろしくお願いしますm(_ _)m

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

  • ベストアンサー
  • noah7150
  • ベストアンサー率46% (116/251)
回答No.1

テキストを直接Selectするなんてやったこと無かったので実験。 うむふむ。 おや?FORMAT([aaa#CSV].F1,'0000000')? なんでカラム1をフォーマット?フォーマット無しで・・・ あら、カラム1の文字項目がエラーに Web検索 ページ発見 http://www.accessclub.jp/bbs5/0029/vba9093.html なんだそういう事か 実験から得た自分なりの結論。 やはりiniを作らないと駄目みたいですね。 Accessはiniが無い場合、先頭行の内容でカラムの型を 判断しているようですね 先頭行が全桁数字項目は数値項目として扱われその後に発生する 英数字混在はエラーになるようです インサートするテーブルで型を指定しているのにと思っても SELECTのカラムの型には影響しません http://support.microsoft.com/kb/210073/ja も見たけどiniはそれほど難しくないみたいですよ

totomo29
質問者

お礼

ありがとうございました。参照URLがすごく理解しやすくて、無事schema.iniでの取り込みができました。(VBAでschema.iniを作ると言う記事の複雑?なVBAを見て、及び腰になっていました。。。) わざわざ実験までして頂いて、親身になって頂き、非常に感謝しています。 また機会がありましたら、どうぞよろしくお願いします!

関連するQ&A

  • SQL ServerにCSVをインポート

    SQL Server Express 2012にCSVファイルのデータをインポートさせたいと思っています。 SQL Server のデータのうち、主キーはdate型、その他はbit型、nvarchar型です。 SQL Serverのテーブルのデータには、#2013-01-01#, #False#, "あいう"などというデータがあります。 CSVは、Event.csvというデータです。 インポートするにあたって、BULK INSERTを利用しようとしています。 上記のデータで下記のコードをSQL Server Managemant Studio Expressで実行するとエラーとなります。 FROM 'D:\Business\Data\Event.csv' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' ); データを別の文字列にするべきなのか、#で日付やブール値を囲わない方がよいのか、あるいはカラム名の入ったCSVを用意するべきなのかなど、疑問が多いのですが、実際はどうあるべきなのでしょうか。 なお、上記のデータはもともとExcel のデータをVBAを使ってCSVファイルに出力したものなので、CSVの形式を別の状態のデータに変換することはできます。 もともとの目的は、ExcelのデータをSQL Serverのデータにインポートしたいだけです。 よろしくお願い致します。

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

  • 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を使いワンクリックでデータを取り込もうとしています。 よろしくお願いします。

  • Access2000 csvファイルのインポート

    Access2000のVBAを使用してcsvファイルを用意されたテーブルにインポートをしたいのですが、 やっかいな条件があります。 ある決められたフォルダに複数のファイルが存在している、そこから全てのCSVファイルを読み込み、3フィールド目(1行目はタイトル行)の値が「"3"」のものだけインポートする。 あるフィールドには、255文字以上のフィールド(改行文字あり)があります。このフィールドはインポートしてもしなくてもよい 今までは、インポート定義を設定してインポートしていたのですが、csvファイルを判別して、インポート前にフィールドの判別をする方法がわかりません。また、255文字以上の対応もうまくいきません。   

  • CSVファイルをアクセスのテーブルに出力する

    こんにちは Access VBA初心者です。 やりたい処理なのですが CSVファイルをmdb内であらかじめ作成されているテーブルに出力したいのですが、 最初にTransferTextwでワークのテーブルにインポートして そのワークテーブルを1レコードずつ読み込みmdbのあらかじめ作成されているテーブルにINSERTしていくという方法しか今思いつきません。 インポートするとワークテーブルはすべてテキスト型になっていますが、 それを違う型の項目にINSERTするということなど可能なのでしょうか? それとももっとスマートな方法があるのでしょうか? ざっくりと書いてしまいましたが、よろしくお願いいたします。

  • Access2007へCSVデータなどをインポートしたい

    Access2007において顧客データベースを運用しています。 定期的に他のデータベースから書き出したCSVファイルを この顧客データベースの中にインポートしたいのですが可能ですか? CSVのデータををテーブルとしてインポートすることはできるのですが、 データベースの中身(データ)のみを項目ごとに割り振って流し込みたいのです。 よろしくお願いいたします。

  • aspファイルにcsvインポートのSQLを書きたい

    お世話になります。 当方サーバー管理初心者です。 社内イントラ内に古いaspファイルで構成されたイントラサイトがあります。 そのイントラサイト内のあるaspファイルの中に、ボタンがあり、ボタンをクリックしてインポートしたいCSVを指定し、 登録ボタンを押してCSVをインポートすると、社内にあるSQLサーバーにアクセスし、データを追加したいテーブルに CSV内のデータを追加したいのですが、その際のaspファイル内に記載する SQLコマンドはどのようになるのでしょうか? Insert Into データを追加したいテーブル名 Values ( 以降に何を入れたら良いかわかりません。 不足な情報があれば加筆修正いたします。 どうぞよろしくお願いいたします。

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

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

  • 複数csvファイルのデータとファイル名をひとつのACCESSのテーブルにインポートしたい

    1,000個以上のcsvファイルを、C:\tool\csvfiles\に格納し、C:\tool\にあるACCESSファイルのテーブル、「importfiles」にインポートするプログラムをVBAを作成したいです。 条件は、以下を満たしたいです。 ・1番右のフィールドにファイル名を追加したい ・それぞれのフィールドについて、データ型を指定したい ■CSVファイルのサンプル ファイル名(1):0009_xxx_0001.CSV データ内容(1): 部署コード 請求コード 日時  料金 0001   1234   090730 100 0001   1235   090730 150 ファイル名(2):0009_xzy_0002.CSV データ内容(2): 部署コード 請求コード 日時  料金 0002   2234   090730 100 0002   2235   090730 150 ■ACCESSでやりたいこと テーブル名:importfiles データ内容: ファイル名     部署コード 請求コード 日時  料金 0009_xxx_0001.CSV  0001   1234   090730 100 0009_xxx_0001.CSV  0001   1235   090730 150 0009_xzy_0002.CSV 0002   2234   090730 100 0009_xzy_0002.CSV 0002   2235   090730 150 データ型は料金は料金は数値型、それ以外はテキスト型です。 ACCESS 2003を試用しております。 transfertextではファイル名が取得できず、ほかの方法も見当がつかず、本当に困っています。 どなたかご存知の方、よろしくお願いいたします。

  • データのインポートの速度について

    mysqlの1個のテーブル(約1万行)をphpMyAdminでエクスポートしました。エクスポートは一瞬で終わりました。 それを再びphpMyAdminからインポートしようとしたのですが、データが重いらしくタイムアウトのエラーが出てしまいました。 sqlファイルを開いてみると、テーブルへのinsert文が約200行ずつのかたまりごとに区切られてしました。 きっとphpMyAdminの方で、エクスポートする時、「これくらいのかたまりずつ区切っておかないと、スムーズにインポートできなくてエラーになっちゃうよ」と気を利かせて区切ってくれているのだろうと思います。 仕方ないので、sqlファイルを「約200行ずつのinsert文」に分割して、phpMyAdminからインポートしました。 全部で1万行ほどのデータなので、50回ほどその作業を繰り返しました。 エクスポートはスムーズだったので、インポートがこんなに手間がかかるとは思っていませんでした。 最初にその1万行のデータをテーブルに読み込ませたのは、別のcsvファイルを load data infile したり、項目の並び順を入れ替えて insert したりするphpファイルを書いたのですが、さほど重くもなくスムーズに処理できました。 phpMyAdminを使わない方法の方が圧倒的に早い気がするのですが、大きいデータをインポートする際のスムーズな方法がありましたら、アドバイスいただけますでしょうか?