プロが教えるわが家の防犯対策術!

EXCEL VBAでのCSVファイル読み込み、出力で困っています。


データ3件のファイルから3件抽出すると正常にイミディエイトウィンドウへ表示されるのですが
データ約38,000件のファイルから3件抽出すると文字化けする項目があるのです。
文字化けする項目の共通点は256文字以降が、どうやら化けているようです。(長文1、長文2の項目)
教えて!goo でいろいろ探してみましたが、これといった解決策が見つかりませんでした。

また、抽出データをCSVで出力しているのですが
始まりと終わりに " が出力されるので困っています。
" が出力されないようにできるのでしょうか?


当方、COBOLでのコーディング経験は実務で4年ほどありますが
VBAの知識は学校で少し学んだ程度の初心者です。

わかりやすく教えていただけないでしょうか?


sample1.csv データ3件
sample2.csv データ約38,000件(ここにsample1.csvと同じデータが含まれています)


Dim adoCON As New ADODB.Connection
Dim adoRS As New ADODB.Recordset
Dim rec As String


'ADOを使い読み込み専用モードでCSVファイルを扱う準備(オープン)をします
adoCON.Open "Driver={Microsoft Text Driver (*.txt; *.csv)}; " & _
"DBQ=c:\Documents and Settings\デスクトップ\test;" & _
"ReadOnly=1"
Open "C:\Documents and Settings\デスクトップ\test\test.csv" For Output As #1


'SQLを実行し、指定したIDのデータを抽出します
'ID,名前,,,,,,,,,,,長文1,長文2,,,,,,更新日時 ←こんな感じで20項目
Set adoRS = adoCON.Execute("select * from sample1.csv where (ID = 213428) or (ID = 212717) or (ID = 212917)")

'SQLの実行結果をデータが無くなるまでrecへ格納します
Do Until adoRS.EOF = True

rec = rec & adoRS("ID") & "," & adoRS("名前") & "," & adoRS("長文1") & "," & adoRS("長文2") & Chr(10)

'カーソルを次の行へ
adoRS.MoveNext

Loop

'recの内容をイミディエイトウィンドウへ表示
Debug.Print rec

'recの内容を出力
Write #1, rec

'CSVファイルをクローズします
Close #1

'レコードセットをクローズします
adoRS.Close

'データベースのクローズ
adoCON.Close

A 回答 (3件)

フィールドの型が自動判定されるため、


テキスト型で256文字以上が切り捨てられているのでしょう。
http://oshiete.goo.ne.jp/qa/5996792.html
>..schema.iniファイルを作成して対処したほうが良いかと思います。
>256文字以上の文字列を含む列をMemo型で指定します。

>始まりと終わりに " が出力されるので困っています。
[Write#ステートメント]を使ってるからでしょう。
ヘルプで確認してみてください。
>..文字列は、ダブル クォーテーション ("") で囲んで出力します。
提示内容であれば、[Print#ステートメント]で良さそうですが。
    • good
    • 0
この回答へのお礼

http://oshiete.goo.ne.jp/qa/5996792.html
あっ、このページ、何度か見ました!
end-uさんが回答されてたんですね。

iniファイルって初心者には何だか難しそうだなぁ
と思ってよく読んでいませんでした。

ここに質問した後いろいろ調べた結果、勇気をもって
iniファイルを作ってみたら非常に簡単でした!
しかし、参考サイトにはChar型についてしか書かれていなくて。

Memo型だったんですね!おかげで解決できました! ありがとうございます!!
出力内容もPrint #1 で思った通りの出力ができました!

VBAの勉強中ですので、また質問させていただくことがあると思います。
どうぞ、よろしくお願いします。

お礼日時:2010/09/20 16:42

同じコードとは言えませんが、こちらで試してみましたが、おそらく根本的な違いはありませんから、問題ないはずです。



CSVの項目の中のひとつに、550文字を入れてみましたが、特に、文字化け等は発生しませんが、フィールドのデフォルトは255になっていますね。

rs(field).DefinedSize

それを一旦、SQL で読んで、rs に入れてみましたが広がります。

出力の test.csv 側で、文字化けしているということですか?

一般的な話なのですが、CSV が、いわゆる本物のCSVでなく、途中で、見えない区切り信号が入っている可能性があります。私は、どうも、見かけ上のCSV の気がしてならないのですが。

それと、もしダメなら、スピードは、遅いかもしれませんが、

 Open "C:\Documents and Settings\デスクトップ\test\test.csv" For Output As #1
 
で出力しているなら、インポート側も Open ステートメントを使用したらいかがでしょうか。

一旦、配列(Split textline, ",") に入れて、そこで、検索してヒットさせる方法もあります。ただし、本物のテキストファイルでないと、以下はうまく行かないはずです。

Open "C:\Documents and Settings\デスクトップ\test\sample1.csv" For Input As #1

例えば、Binary Access を利用します。
FileName ="C:\Documents and Settings\デスクトップ\test\sample1.csv"
Open FileName For Binary Access Read As #1

>また、抽出データをCSVで出力しているのですが
>始まりと終わりに " が出力されるので困っています。
>" が出力されないようにできるのでしょうか

例:
buf = Mid(adoRS("長文1"),2, Len(adoRS("長文1")-2)
    • good
    • 0
この回答へのお礼

お忙しい中、回答ありがとうございます。

おかげさまで、文字化けはiniファイルを作ることで解決しました。
出力内容もPrint #1 で思った通りの出力ができました。


VBAの勉強中ですので、また質問させていただくことがあると思います。
どうぞ、よろしくお願いします。

お礼日時:2010/09/20 16:45

(1) Excel のバージョンは何ですか?


(2) CSV への出力をVBAのWrite文でなさっていますが、
  Workbook.SaveAs メソッドで FileFormat:=xlCSV としても
  イケルはずですが、試されましたか?
  " で囲む件はこれで解決するかもしれません。
(3) 読み出した情報を全部ひとつの文字列変数に格納してから出力されていますが
  1レコード毎に出力していってはマズイ理由はありますか?
  文字化けの理由はこれかもしれません。お試し下さい。
(4) 余談ですが、どうしてもVBAでファイル出力するなら
  Print #1 文の方が扱いやすいかもしれません。
    • good
    • 0
この回答へのお礼

(1)記載を忘れていました。すみません。 2003 SP3です。
(2)出力方法がいろいろあることは知っていたのですが、
 write の方が馴染み深かったので使用しました。出力できれば何でもOKです。
(3)これは試しました。変わらず文字化けしてました。
(4)Print #1 で思った通りの出力ができました! ありがとうございます!!

文字化けの件はiniファイルを作ることで解決しました。回答ありがとうございました。
VBAの勉強中ですので、また質問させていただくことがあると思います。
どうぞ、よろしくお願いします。

お礼日時:2010/09/20 16:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています