-PR-
解決
済み

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

  • すぐに回答を!
  • 質問No.92403
  • 閲覧数1224
  • ありがとう数3
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 20% (2/10)

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テーブルに取り込む良い方法を教えてください。
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.3
レベル7

ベストアンサー率 77% (14/18)

すいません。ちゃんと読んでませんでした。もう一度。

"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
・・・
という風に処理していくことになるかと思います。

どうでしょうか?
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.1
レベル7

ベストアンサー率 77% (14/18)

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

1.CSVファイルをLine Inputで読み込む。
2.読み込んだデータをSplit関数で配列に取り込む。
3.後は好きなようにテーブルにINSERTする。
の繰り返し。

としてはどうでしょうか?
(VB6.0でない場合は2のSplit関数は使えませんが・・・)


  • 回答No.2
レベル11

ベストアンサー率 40% (170/415)

アクセスのVBAで取り込むという意味だと思いますがいかがですか? このような場合、LineInputで1行ずつ取り込んで、ロジックで分割していきます。 Instrで、「""」「",」「"",」などの位置を調べて、データを切り出すことができます。 まず、行頭が「"」だけか「""」なのか。 フラグをセットするといい ...続きを読む
アクセスのVBAで取り込むという意味だと思いますがいかがですか?

このような場合、LineInputで1行ずつ取り込んで、ロジックで分割していきます。
Instrで、「""」「",」「"",」などの位置を調べて、データを切り出すことができます。

まず、行頭が「"」だけか「""」なのか。
フラグをセットするといいかと思います。
If Instr(strLine,Chr(34) + Chr(34)) = 1 then
intFlg = 1 '2個でくくられている
Endif
とかですね。

次に、「",」か「"",」の前までがデータになるので、その位置を調べて、1つ前までをMid()などで切り出します。

次のデータを切り出すには、文字検索の開始位置を指定する方法か、前の処理済の部分をRight()でカットしてしまう方法で対処します。

データの中に「,"」や「,""」が含まれる場合は、うまく対処できない可能性があります。
(データフィールドの終わりと同じ文字列になってしまうため)

それにしても大変ですね。
列数が長いときは、テーブルを分けて関連付けしてしまうといいんじゃないかと思いますが、アクセス自体はほとんど使ったことがないのでよくわかりませんです。
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ