LoginSignup
3
4

More than 3 years have passed since last update.

【Go, golang】Microsoft ExcelでもNumbersでもcsvファイルを文字化けしないように作成する。

Last updated at Posted at 2019-09-26

前置き

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でファイルを開いてみると...
スクリーンショット 2019-09-27 2.44.37.png
エンコーティングのところが「Unicode(UTF-8)B...」(これ、BOM付きってことです。見難いですが...)となっていて、BOM付きなことがわかります。

MacのMicrosoft Excelで開いてみると、最初にテキストファイルウィザードのウィンドウは表示されますが、
区切り文字の取り扱いとかを選んで「完了」を押すと、
スクリーンショット 2019-09-27 2.47.57.png
こんな感じでみることができます。...よかった。

3
4
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
3
4