プログラムでCSVファイルを出力し、Excelで見たときに、文字化けしたり、意図しないセル分割が行われたりして正しく表示されないことがあります。
対応方法
Excelで表示されるフォーマットでCSV出力します。
文字コード、区切り文字
Excelに合った文字コード、区切り文字の組み合わせにします。
文字コード | BOM | 区切り文字 |
---|---|---|
UTF-8 | あり | カンマ |
UTF-16 | あり | タブ |
Shift_JIS | なし | カンマ |
エスケープ
エスケープを正しく行います。
文字 | エスケープ方法 |
---|---|
, | 要素を""で囲む |
" | "" |
エスケープの例)
前)
William,"Red",Garland
後)
"William,""Red"",Garland"
C#でCSVファイルを出力する例
/* CSVに出力するリスト */
var list = new List<string[]>();
list.Add(new string[3] { "山田太郎", "やまだたろう", "Taro Yamada" });
list.Add(new string[3] { "渡辺 \"レッド\" 花子", "わたなべ,れっど,はなこ", "Watanabe \"Red\" Hanako" });
/* ファイルオープン (上書き、UTF-8、BOMあり) */
var sw = new StreamWriter("test.csv", false, Encoding.GetEncoding("utf-8"));
foreach (string[] valueArray in list)
{
var sb = new StringBuilder();
foreach (string value in valueArray)
{
/* エスケープ処理 */
string tmp = value.Replace("\"", "\"\"");
sb.Append("\"");
sb.Append(tmp);
sb.Append("\"");
/* カンマ区切り */
sb.Append(",");
}
/* 余分なカンマを消してから書き込み */
sb.Remove(sb.Length - 1, 1);
sw.WriteLine(sb.ToString());
}
sw.Close();