1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

C#でCSVを出力するときの注意

Posted at

#CSVって便利だよね
Excel等の表計算ソフトにデータをエクスポートしたいとき、.xlsxを作ったりするの、できなくはないけど結構面倒ですよね。だから、CSVで出力したりする。
単に数字やアルファベットだけを取り扱うのなら、

export.cs
File.WriteAllLines(FileName, CSVData);

みたいな形で書けます。
しかし、CSVDataにASCII以外の文字が入っていると、Excelは正確に認識してくれません。
UTF-8で書き出しているはずなのですが、ShiftJISとして読んだ結果文字化けします。
(Excelから開くことはできますが、CSVの関連付けで開くと文字化けします)

さて、解決方法です。日本語版のExcelですと、デフォルトはShiftJISとして認識します。一方、英語版だとANSIで認識します。一方、BOM付きのUTF-8で書き出すとExcelはちゃんと認識してくれて、UTF-8として読み込んでくれます。
BOMがついていない場合はデフォルトのコードページで、BOMがついている場合BOMに応じて読み込むそうです。

#UTF-8(BOM)付きで書き出す方法
あれ?と思うかもしれません。
確かに、File.WriteAllLinesには、Encoding引き数があります。しかし、デフォルトでUTF-8(BOM無し)で書き込むわけで、Encode引数指定なしでの書き出しはEncodingにEncoding.Text.UTF8Encodingを指定した書き出しが実行される様に思うじゃないですか。
そう、そんな風に考えていたことが私にもありました。

実はMicrosoftのサイトにはこういうことが書いてあります。

メソッドの既定の動作で WriteAllLines は、バイトオーダーマーク (BOM) なしで utf-8 エンコーディングを使用してデータを書き出します。 ファイルの先頭に UTF-8 識別子 (バイトオーダーマークなど) を含める必要がある場合は、 WriteAllLines(String, String[], Encoding) エンコードでメソッドオーバーロードを使用し UTF8 ます。
System.IO.File.WriteAllLines

そう、Encoding.Text.UTF8Encoding指定とEncoding指定なしのメソッドは動作が違います。

そうです。

export.cs
File.WriteAllLines(FileName, CSVDataEncoding.Text.UTF8Encoding);

が正しいのです。これで、Excelがちゃんと文字コードを認識して読み込んでくれます。めでたしめでたし。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?