プロが教える店舗&オフィスのセキュリティ対策術

VB.NET初心者です
変数に必要なデータを入れて、それをCSVに書き込もうとしているのですが、
データの中にカンマを含むものが存在して、
エクセルで開くと本来1セルでよいところが、2セル使って
他の行と比べるとずれてしまいます

たとえば、A~Eを変数として

A=あ
B=い,い
C=う
D=え
E=お

というデータがあって、それをA,B,C,D,Eの順に
横一列でCSVにした場合

「あ い,い う え お」

と5列にしたいところが、

「あ い い う え お」

と6列になってしまうのです。
これはどのように解決すればよいでしょうか?
どうかご教授願います。


[開発環境]
WinXPPRO/VB.NET2003/Excel2000

A 回答 (6件)

確かに・・・



strCsvData = """A"""
strCsvData += ","
strCsvData += """B"""
strCsvData += ","
strCsvData += """C"""
strCsvData += ","
strCsvData += """D"""
stbCsvData += ","
stbCsvData += """E"""

だと "A","B","C","D","E" となりますね。

何故か・・・それは A~E を変数として記述してないからです。
わかりやすく言うと "" でくくった A は文字列として認識されます。
変数として利用したい場合は A を変数として使ってあげる必要があるのです。

strCsvData = """
strCsvData += A
strCsvData += """
strCsvData += ","
strCsvData += """
strCsvData += B
strCsvData += """
strCsvData += ","
strCsvData += """
strCsvData += C
strCsvData += """
strCsvData += ","
strCsvData += """
strCsvData += D
strCsvData += """
stbCsvData += ","
stbCsvData += """
strCsvData += E
strCsvData += """

このようにすれば A~E を変数として使ってあげることになります。

いくら A~E を変数として宣言しても "A" と A は違う物です。
"A" は文字列「A」、A は変数「A」です。

---------------------------------------------------------------
わかりにくい場合のテストコード

Dim strTest As String
Dim strData As String

'「文字列」を変数に格納
strTest = "文字列"
'(1) strDataには「文字列」が格納される
strData = strTest
'(2) strDataには「strTest」が格納される
strData = "strTest"

'(1)では strTest を変数として利用、(2)では strTest という文字列として利用

デバッグしてみて下さい。

この回答への補足

詳しいコードありがとうございます。
上記のものを環境に合わせてテストしてみたのですが、
どうやらstrCsvData = """の部分が
strCsvData = """"になってしまう(要するに、”が1つ補正されて増えてしまう)ためか、やはりうまく動きませんでした。
解決するにはどのようにしたらよいでしょうか?

"A"とAの区別はつきます。

補足日時:2009/07/21 11:20
    • good
    • 0

CSVは


A項目データを""で囲まない方式
B項目データを""で囲む方式
が昔からあり、数字項目と文字列項目で扱いを異にしている方式もある。
数値も文字列もB
数値はA、文字列はB
数値も文字列もA
この第1か第2かを採用し、そうすると文字列は""で囲まれるから
中にカンマを入れることが出来て、セパレータのカンマと区別できる。
あくまで完成品のCSVファイルをその後利用するソフトの目安がついているだろうから、そのソフトの機能(扱いが出来るか)によるので勝手に作らないように。

この回答への補足

ごめんなさい。
初心者のため、おっしゃっている意味がよくわかりません。

補足日時:2009/07/21 11:23
    • good
    • 0

詳しくは知りませんが、


FileSystem.WriteLineであれば、文字列には自動的に""が付加されるので","が含まれていても大丈夫ではないでしょうか。
FileSystem.PrintLineやSystem.IO.StreamWriterでは""は付加されないと思いますので自分で""を書き込む必要があるはずです。

[参考]
FileSystem.WriteLine メソッド
http://msdn.microsoft.com/ja-jp/library/microsof …
    • good
    • 0

CSVはカンマ区切りなので、既にカンマが含まれているのをそのまま書き込むと、2つのデータとしてしまいます。


カンマを含むデータを、1つとしたい場合、「"」(ダブルクォーテーション)で囲んで下さい。
この場合、
B="い,い"
とします。
    • good
    • 0

カンマも文字列として判定したいということですね。


その場合は " (ダブルコーテーション)で文字列を囲んであげれば可能です。

strCsvData = """あ"""
strCsvData += ","
strCsvData += """い,い"""
strCsvData += ","
strCsvData += """う"""
strCsvData += ","
strCsvData += """え"""
stbCsvData += ","
stbCsvData += """お"""

完成した文字列は
"あ","い,い","う","え","お"
となります。

あとはCSV形式で開く際に引用符を指定してあげれば希望通りの結果が得られると思います。

この回答への補足

私もダブルクォーテーションで囲むのはやってみました。
しかしみなさんおっしゃられるように書込みたい値を直接使うならOKなのですが、

例えば#2さんのように

strCsvData = """あ"""
strCsvData += ","
strCsvData += """い,い"""
strCsvData += ","
strCsvData += """う"""
strCsvData += ","
strCsvData += """え"""
stbCsvData += ","
stbCsvData += """お"""

は、できます
しかし値は変数A~Eに入っているので、

strCsvData = """A"""
strCsvData += ","
strCsvData += """B"""
strCsvData += ","
strCsvData += """C"""
strCsvData += ","
strCsvData += """D"""
stbCsvData += ","
stbCsvData += """E"""

だと変数が文字列扱いになって
結果が

A B C D E

になってしまうのです。

補足日時:2009/07/17 13:32
    • good
    • 0

"い,い"



「"」で囲んでみたら?
    • good
    • 0

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

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