- ベストアンサー
CSV形式ファイルにある、カンマについて
こんにちは。 現在、VB2005で、CSV形式のファイルを読むプログラムを 作っているのですが、CSV形式の1フィールドの中に カンマが入っているデータがあります。 フィールドの区切りのカンマではなく、文字としての カンマとして取り扱う場合は、そのカンマはどのように 変換すればいいのでしょうか? エスケープシーケンスという方法があるというところまでは わかったのですが、具体的にどのようにすればいいのかが わかりません。 よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
作成したcsvファイルの利用目的によると思います。 すなわち、 1.作成したcsvファイルは汎用的な目的で使用する(そのままcsvとして扱う)場合。 (すなわちテキストエディタで開く、ExcelやCSVを扱うツールで使用する場合) 2.作成したcsvファイルはある特定のシステムに使用する場合。 (すなわちデータ交換のフォーマットとして利用する場合) 1である場合、エスケープしたところで意味がありません。 #1さんもおっしゃられていますが、「"」(ダブルクォーテーション)で括るのが一般的です。 しかし、「"」で括れば必ず安心というものでもありません。 ものによっては「"」あるなしに関わらず、カンマや改行を区切り文字として扱う場合もあります。 それはcsvファイルが「カンマ区切りであること」以外に明確な仕様として確立していないためです。 考えてもらえばわかると思いますが、「"」で括るということはカンマは使えるようになりますが、 今度は「","」という文字列が使えません。 つまり、エスケープを使わない限りいたちごっこなのです。 エスケープを使わなければこの問題は解決できないのですが csvはそこまで明確な仕様はどこにも規定はされておりません。 2の場合はエスケープを使うことができますが、エスケープ文字については予め送信側と受信側で取り決めておかなくてはなりません。 例えば「,」を「&2c;」、「&」を「&」というようにエスケープを取り決めます。 このとき、次の文章は次のようにエンコードすれば良いです。 "tom,joe","chage&aska" ↓変換 "tom&2c;joe","chage&aska" 送信側の変換は必ず「&」から変換し、その後「,」をエスケープします。 受信側はその逆で、まず「,(&2c;)」からデコードし、その後「&(&)」をデコードします。 さらに改行などもエスケープしたい場合も同様にエスケープ文字を増やすと良いです。 エスケープ方法として「&」と「;」で囲む方法を示しましたが 他の表記法でエスケープしてももちろん問題ありません。 正規表現でよく使われる「\(バックスラッシュ)」でも良いと思います。 長文をすみませんでした。
その他の回答 (2)
- chochobizo
- ベストアンサー率42% (30/70)
元データがcsv以外の形式でも可能であるなら、tab区切りテキストデータで考えてみても良いかもしれません。
お礼
ありがとうございました。TAB区切りにしようと思います。
- imogasi
- ベストアンサー率27% (4737/17069)
区切りのカンマと区別が付かないですから、元のデータを作り直すほか無いのでは。ダブルクオートで囲むとかTAB区切りやPRN形式にでも作り直すとか。 今のままで復元するロジックを、質問者は考えられますか。多分複雑化するとかして良い方策は無いでしょう。 参考 http://ja.wikipedia.org/wiki/Comma-Separated_Values >フィールドがコンマ、ダブルクォート、改行を含む場合は、かならずダブルクォートで囲む
お礼
詳しい回答ありがとうございました。 TAB区切りにしようと思います。
お礼
詳しい回答ありがとうございました。考え方が整理できました。 TAB区切りにしようと思います。