前置き
Goでcsvを扱う記事はQiitaでも色々ありますが、半分自分のメモ代わりということで。
Microsoft Excelでも、Numbersでもcsvファイルを開いた時、文字化けしないファイルを作って出力するようにします。
サンプルは、比較的見たこともあるものかと思います。
環境
go version: 1.11.4
os: MacOS
サンプルコード
package main
import (
"encoding/csv"
"os"
"log"
"bufio"
)
func main() {
// ファイルがあれば開く、なければ新しく作成するようにしています。
file, err := os.OpenFile("new_company.csv", os.O_RDWR|os.O_CREATE, 0755)
if err != nil {
log.Fatal(err)
}
// Excelでも見れるようにするには、BOM付きUTF8にする必要があるので、fileの先頭にBOMを付与。
bw := bufio.NewWriter(file)
bw.Write([]byte{0xEF, 0xBB, 0xBF})
// csvデータ
records := [][]string{
{"id", "name", "address"},
{"1", "Softbank", "日本のどこか"},
{"2", "au", "多分日本のどこか"},
{"3", "Docomo", "おそらく日本のどこか"},
}
w := csv.NewWriter(bw)
// w.Writeで1行づつやってもいいですが、一括でデータを取り込みできるので、今回はWriteAllにしました。
// 必要に応じて使ってください。なお、WriteAllの場合、w.Flush()をしなくて良いのでわずかですがコード短縮になる(...?)
w.WriteAll(records)
if err := w.Error(); err != nil {
log.Fatal(err)
}
// 最後にfileを閉じます。
if err := file.Close(); err != nil {
log.Fatal(err)
}
}
個人的ポイント
bufioを使ってBOMの付与
https://qiita.com/bbq-all-stars/items/03fa27eeb6f46b580525
や
https://pinzolo.github.io/2017/03/29/utf8-csv-with-bom-on-golang.html
を参考にしつつ試してみました。
やはりcsvデータとなるデータの前にBOMを付与するところでしょうか。
どんな感じになったか
上記サンプルコードで、go run main.go
してファイルを生成した後、
lessコマンドで中身をみてみると、
<U+FEFF>id,name,address
1,Softbank,日本のどこか
2,au,多分日本のどこか
3,Docomo,おそらく日本のどこか
new_company.csv (END)
のように、先頭にBOMが付いているのがわかります(catコマンドだと付いているかわからない)。
Cot Editorでファイルを開いてみると...
エンコーティングのところが「Unicode(UTF-8)B...」(これ、BOM付きってことです。見難いですが...)となっていて、BOM付きなことがわかります。
MacのMicrosoft Excelで開いてみると、最初にテキストファイルウィザードのウィンドウは表示されますが、
区切り文字の取り扱いとかを選んで「完了」を押すと、
こんな感じでみることができます。...よかった。