• ベストアンサー

VBでCSVファイルを取り込み、Accessに格納する方法

VBから、csvファイルを取り込んで、Accessのテーブルに格納したいので すが、Input# でうまくいきません。 csvファイルは、基本的に,区切りですが 1)値の両端を"でくくる。 2)値として"がある場合は、""に変換する。 という仕様です。(ExcelでCSVファイルを作るときと同じ) 3)先頭13列が、上記のような仕様   さらに14列目から290列目までは数値データで、値を""でくくらない。 データ例として、 "aaa","""値""",""",,","""値2,,""","bbb",・・・"ccc",0,1,2,・・・,276 === ====== ==== ========== === === = = = ===  1 2 3 4 5 13 141516 290 1の値:aaa 2の値:"値"," 3の値:",, 4の値:"値2,," 5の値:bbb としてテーブルに取り込みたいです。 Access2000では、255列以上は取り込めないため、 14列目以降の値を9個ずつ別レコードに分けています。 つまり、22列のテーブルにレコード化しています。 レコード1:列1~13の値+列14~22の値 レコード2:列1~13の値+列23~31の値 ・・・ 255列の制限は仕方ないとしても、上記のようなCSVファイルを VBでAccessテーブルに取り込む良い方法を教えてください。

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

  • ベストアンサー
  • tom777
  • ベストアンサー率77% (14/18)
回答No.3

すいません。ちゃんと読んでませんでした。もう一度。 "aaa","""値""",""",,","""値2,,""","bbb" をSplitでばらすと 配列0の値:"aaa" 配列1の値:"""値""" 配列2の値:""" 配列3の値: 配列4の値:" 配列5の値:"""値2 配列6の値: 配列7の値:""" 配列8の値:"bbb" となりますので、配列0番目から順にダブルクゥオートの数 をチェックしていくことになると思います。 配列0はaaaでOK 配列1も""値""でOK(後で""を"に変換する必要あり) 配列2は"が一つなのでおかしい。 よって、配列2と3をカンマでつなぐ。(""",) でもまだおかしいので、配列2と3と4をカンマでつなぐ。(""",,") 配列2,3,4は"",,でOK ・・・ という風に処理していくことになるかと思います。 どうでしょうか?

その他の回答 (2)

  • i-touch
  • ベストアンサー率40% (170/415)
回答No.2

アクセスのVBAで取り込むという意味だと思いますがいかがですか? このような場合、LineInputで1行ずつ取り込んで、ロジックで分割していきます。 Instrで、「""」「",」「"",」などの位置を調べて、データを切り出すことができます。 まず、行頭が「"」だけか「""」なのか。 フラグをセットするといいかと思います。 If Instr(strLine,Chr(34) + Chr(34)) = 1 then intFlg = 1 '2個でくくられている Endif とかですね。 次に、「",」か「"",」の前までがデータになるので、その位置を調べて、1つ前までをMid()などで切り出します。 次のデータを切り出すには、文字検索の開始位置を指定する方法か、前の処理済の部分をRight()でカットしてしまう方法で対処します。 データの中に「,"」や「,""」が含まれる場合は、うまく対処できない可能性があります。 (データフィールドの終わりと同じ文字列になってしまうため) それにしても大変ですね。 列数が長いときは、テーブルを分けて関連付けしてしまうといいんじゃないかと思いますが、アクセス自体はほとんど使ったことがないのでよくわかりませんです。

  • tom777
  • ベストアンサー率77% (14/18)
回答No.1

VBのバージョンが6.0だと仮定して・・・ 1.CSVファイルをLine Inputで読み込む。 2.読み込んだデータをSplit関数で配列に取り込む。 3.後は好きなようにテーブルにINSERTする。 の繰り返し。 としてはどうでしょうか? (VB6.0でない場合は2のSplit関数は使えませんが・・・)