- 締切済み
CSV書込みの際、カンマで位置がずれる
VB.NET初心者です 変数に必要なデータを入れて、それをCSVに書き込もうとしているのですが、 データの中にカンマを含むものが存在して、 エクセルで開くと本来1セルでよいところが、2セル使って 他の行と比べるとずれてしまいます たとえば、A~Eを変数として A=あ B=い,い C=う D=え E=お というデータがあって、それをA,B,C,D,Eの順に 横一列でCSVにした場合 「あ い,い う え お」 と5列にしたいところが、 「あ い い う え お」 と6列になってしまうのです。 これはどのように解決すればよいでしょうか? どうかご教授願います。 [開発環境] WinXPPRO/VB.NET2003/Excel2000
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
CSVは A項目データを""で囲まない方式 B項目データを""で囲む方式 が昔からあり、数字項目と文字列項目で扱いを異にしている方式もある。 数値も文字列もB 数値はA、文字列はB 数値も文字列もA この第1か第2かを採用し、そうすると文字列は""で囲まれるから 中にカンマを入れることが出来て、セパレータのカンマと区別できる。 あくまで完成品のCSVファイルをその後利用するソフトの目安がついているだろうから、そのソフトの機能(扱いが出来るか)によるので勝手に作らないように。
- kazuhisa01
- ベストアンサー率32% (158/487)
確かに・・・ 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の区別はつきます。
- OMEGAT
- ベストアンサー率70% (455/642)
詳しくは知りませんが、 FileSystem.WriteLineであれば、文字列には自動的に""が付加されるので","が含まれていても大丈夫ではないでしょうか。 FileSystem.PrintLineやSystem.IO.StreamWriterでは""は付加されないと思いますので自分で""を書き込む必要があるはずです。 [参考] FileSystem.WriteLine メソッド http://msdn.microsoft.com/ja-jp/library/microsoft.visualbasic.filesystem.writeline.aspx
- S-Fuji
- ベストアンサー率36% (592/1624)
CSVはカンマ区切りなので、既にカンマが含まれているのをそのまま書き込むと、2つのデータとしてしまいます。 カンマを含むデータを、1つとしたい場合、「"」(ダブルクォーテーション)で囲んで下さい。 この場合、 B="い,い" とします。
- kazuhisa01
- ベストアンサー率32% (158/487)
カンマも文字列として判定したいということですね。 その場合は " (ダブルコーテーション)で文字列を囲んであげれば可能です。 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 になってしまうのです。
- ProKaseifu
- ベストアンサー率51% (98/192)
"い,い" 「"」で囲んでみたら?
補足
ごめんなさい。 初心者のため、おっしゃっている意味がよくわかりません。