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
No.2ベストアンサー
- 回答日時:
フィールドの型が自動判定されるため、
テキスト型で256文字以上が切り捨てられているのでしょう。
http://oshiete.goo.ne.jp/qa/5996792.html
>..schema.iniファイルを作成して対処したほうが良いかと思います。
>256文字以上の文字列を含む列をMemo型で指定します。
>始まりと終わりに " が出力されるので困っています。
[Write#ステートメント]を使ってるからでしょう。
ヘルプで確認してみてください。
>..文字列は、ダブル クォーテーション ("") で囲んで出力します。
提示内容であれば、[Print#ステートメント]で良さそうですが。
http://oshiete.goo.ne.jp/qa/5996792.html
あっ、このページ、何度か見ました!
end-uさんが回答されてたんですね。
iniファイルって初心者には何だか難しそうだなぁ
と思ってよく読んでいませんでした。
ここに質問した後いろいろ調べた結果、勇気をもって
iniファイルを作ってみたら非常に簡単でした!
しかし、参考サイトにはChar型についてしか書かれていなくて。
Memo型だったんですね!おかげで解決できました! ありがとうございます!!
出力内容もPrint #1 で思った通りの出力ができました!
VBAの勉強中ですので、また質問させていただくことがあると思います。
どうぞ、よろしくお願いします。
No.3
- 回答日時:
同じコードとは言えませんが、こちらで試してみましたが、おそらく根本的な違いはありませんから、問題ないはずです。
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)
お忙しい中、回答ありがとうございます。
おかげさまで、文字化けはiniファイルを作ることで解決しました。
出力内容もPrint #1 で思った通りの出力ができました。
VBAの勉強中ですので、また質問させていただくことがあると思います。
どうぞ、よろしくお願いします。
No.1
- 回答日時:
(1) Excel のバージョンは何ですか?
(2) CSV への出力をVBAのWrite文でなさっていますが、
Workbook.SaveAs メソッドで FileFormat:=xlCSV としても
イケルはずですが、試されましたか?
" で囲む件はこれで解決するかもしれません。
(3) 読み出した情報を全部ひとつの文字列変数に格納してから出力されていますが
1レコード毎に出力していってはマズイ理由はありますか?
文字化けの理由はこれかもしれません。お試し下さい。
(4) 余談ですが、どうしてもVBAでファイル出力するなら
Print #1 文の方が扱いやすいかもしれません。
(1)記載を忘れていました。すみません。 2003 SP3です。
(2)出力方法がいろいろあることは知っていたのですが、
write の方が馴染み深かったので使用しました。出力できれば何でもOKです。
(3)これは試しました。変わらず文字化けしてました。
(4)Print #1 で思った通りの出力ができました! ありがとうございます!!
文字化けの件はiniファイルを作ることで解決しました。回答ありがとうございました。
VBAの勉強中ですので、また質問させていただくことがあると思います。
どうぞ、よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- Visual Basic(VBA) マクロを教えてください。 7 2023/06/01 19:47
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- その他(プログラミング・Web制作) データ解析ソフトRでのファイル入力read.csvがエラーになります 7 2022/03/27 22:11
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
EXCEL2000のマクロ(ADO)にてCSVデータ取得しようとしたら
その他(Microsoft Office)
-
VBAで文字を反映させると255文字の制限になってしまいます。
Visual Basic(VBA)
-
変数に256文字以上のテキストを格納したい
Visual Basic(VBA)
-
-
4
Excel 1セル当りの文字数が255文字を超える場合のADOからの取
その他(プログラミング・Web制作)
-
5
【Excel VBA】CSV取込時、数字の先頭の0を消えないようにするには?
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CSVファイルの時刻の形式について
-
accessでクエリをExcelにエクス...
-
Acrobat参照設定
-
Thunderbird 受信メールからの...
-
EXCEL VBAでプリントイメージフ...
-
アクセス→エクセルへエクスポー...
-
ACCESS エクスポート ダイアロ...
-
コマンドプロンプトのテキスト...
-
エクセルVBAでフォルダ内に...
-
ファイナルカットで編集した動...
-
Excel で「OLE は現在使用でき...
-
C++.NET 2003 「空のドキュメ...
-
ATTファイルってどうやって開け...
-
C++によるファイル送受信プログ...
-
C#について質問【複数の.datフ...
-
Javaのプロパティファイルの文...
-
テキストファイルの一部分を抽...
-
VB.NET テキストファイルにデー...
-
ファイル更新日取得
-
BASP21のファイルアップロード...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
accessでクエリをExcelにエクス...
-
CSVファイルの時刻の形式について
-
COBOL、項目末尾に空白がある場...
-
コマンドプロンプトのテキスト...
-
Thunderbird 受信メールからの...
-
AccessのレポートからPDFをペー...
-
accessのリポートを、excelに出...
-
COBOL FILLER
-
WshShellから起動したbat(ftp)...
-
Acrobat参照設定
-
ファイナルカットで編集した動...
-
クエリをエクセルファイルへの出力
-
excel vbaでのxml出力がわかり...
-
ショートカットで起動した場合...
-
VBA 参照先で選んだファイルを...
-
iTextでPDFを表示させたら日本...
-
Excel で「OLE は現在使用でき...
-
“ファイルに出力”した印刷ファ...
-
EXCEL VBAでのCSVファイル読み...
-
TransferSpreadsheetでフルパス...
おすすめ情報