Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11 Pro : Access 2019)
csvファイルの読み込み
投稿日時: 25/09/11 19:46:38
投稿者: kkkc

お世話になります。
 
あるフォルダーにあるcsvファイルすべてを読み込んで、
Accessのテーブルに書き込みたいです。
csvファイル1行を1レコードとします。
 
通常のcsvファイルはできたのですが、
今回取り込もうとしているcsvファイルが文字化けしたり、
1行1レコードにならずに困っています。
 
原因はcsvファイルが、
 
・UTF-8(BOM付き)
・改行コードが\n
 
でした。
UTF-8(BOM付き)に対応しようとすると改行コードが解決できず、
改行コードに対応しようとするとUTF-8(BOM付き)が解決できずに
行き詰ってしまいました。
 
改行コードが\nのものをCRLFにして別ファイルを作る、
という方法もあったのですが、
ファイル数は増やしたくありません。
 
解決方法を教えていただけないでしょうか?
 
 

回答
投稿日時: 25/09/11 21:11:14
投稿者: sk

引用:
あるフォルダーにあるcsvファイルすべてを読み込んで
Accessのテーブルに書き込みたいです。

・( Access データベース上の既存のテーブルをインポート先としているとして)
 具体的にどのような手法、コード、オブジェクトを用いてそれを実行しようとしたのか。
 
引用:
原因はcsvファイルが、
  
・UTF-8(BOM付き)
・改行コードが\n
  
でした。

・そのフォルダ上にある csv ファイルは全て上記の仕様に該当するのか、
 それとも、一部の csv ファイルのみが上記の仕様に該当するのか。
 (全てのテキストファイルの仕様は統一されているのか)
 
とりあえず、以上の 2 点について明記されることをお奨めします。
 
また、Access のテキストインポートウィザードを用いて
上記の CSV ファイルをインポートする際、コードページを
「UTF-8」と指定した上でインポートを実行してみたら
どのような結果となるかを確認されることをお奨めします。

投稿日時: 25/09/12 08:35:56
投稿者: kkkc

お世話になります。
 
コードは次の通りです。
 
With CreateObject("ADODB.Stream")
       .Charset = "UTF-8" 'SJISの場合、"shift_jis"
       .Open
       .LoadFromFile strFILE
         
        Do Until .EOS
            sBuf = .ReadText(-2) '1行づつバッファへ格納
            MsgBox sBuf
            Call Import_rtn
        Loop
         
        .Close
 End With
 
 
これで1行ずつMsgBoxが実行されると思いましたが、
すべての行が表示されてしまいます。
 
フォルダーの中にあるcsvファイルは、どれも同じ仕様です。
あるデーターが、日付単位でcsv出力されたものです。
 
Accessのインポート機能でインポートしたところ、
問題なくインポートできました。
 
なので、てっきり改行コードの指定の仕方が悪いのかなと思ってました。
 
 
 

投稿日時: 25/09/12 08:40:54
投稿者: kkkc

改行されるところに注目してみました。
 
改行される前は「合計」になります。
改行された後は「オペレータ」になります。
 
しかし、Accessのテーブルのフィールドには、
 
「合計
オペレータ」
 
という文字が入っていました。
 

回答
投稿日時: 25/09/12 11:03:10
投稿者: sk

引用:
改行コードが\n

引用:
With CreateObject("ADODB.Stream")
       .Charset = "UTF-8" 'SJISの場合、"shift_jis"
       .Open
       .LoadFromFile strFILE

ではとりあえず、Stream オブジェクトの Open メソッドを呼び出す前に
LineSeparator プロパティの設定を行なうようにして下さい。
 
--------------------------------------------------------
With CreateObject("ADODB.Stream")
    .Charset = "UTF-8" 'SJISの場合、"shift_jis"
    '行区切り記号を LF(ラインフィード)とする
    .LineSeparator = 10     'ADODB の列挙定数クラス LineSeparatorsEnum のメンバー adLF と同じ値
    .Open
    .LoadFromFile strFILE
--------------------------------------------------------
 
引用:
フォルダーの中にあるcsvファイルは、どれも同じ仕様です。

引用:
Accessのインポート機能でインポートしたところ、
問題なくインポートできました。

Access のインポート機能を利用する場合は、あらかじめインポート定義を作成した上で
DoCmd オブジェクトの TransferText メソッドを呼び出す、という別の方法もあるでしょう。

投稿日時: 25/09/13 08:50:13
投稿者: kkkc

お世話になります。
 
.LineSeparator = 10
を追加することで無事解決しました。
ありがとうございました。