Go言語でCSVを書き出す!エクセル用のSJIS版も!


デフォルトで用意されているencoding/csvを使うのが楽みたい。日本語も出力できる。

main.go
package main

import (
    "encoding/csv"
    "log"
    "os"
)

func failOnError(err error) {
    if err != nil {
        log.Fatal("Error:", err)
    }
}

func main() {
    // O_WRONLY:書き込みモード開く, O_CREATE:無かったらファイルを作成
    file, err := os.OpenFile("/tmp/people.csv", os.O_WRONLY|os.O_CREATE, 0600)
    failOnError(err)
    defer file.Close()

    err = file.Truncate(0) // ファイルを空っぽにする(実行2回目以降用)
    failOnError(err)

    writer := csv.NewWriter(file)
    writer.Write([]string{"Alice", "20"})
    writer.Write([]string{"Bob", "21"})
    writer.Write([]string{"Carol", "22"})
    writer.Flush()
}

writer.Writeでバッファにためて、writer.Flushで一気に書き込むようだ。

実行してみる

go run main.go && cat /tmp/people.csv

実行結果

Alice,20
Bob,21
Carol,22

CSVをSJISで出したい

CSVを出す目的はだいたいがエクセルで開くため。
日本語のエクセルは文字コードがSJISなので、SJISでCSVを出力してみる。

UTF-8からSJISへの変換は、github.com/djimenez/iconv-go を使う。io.Writerのインターフェイスにそって作ってある。

main.go
package main

import (
    "encoding/csv"
    iconv "github.com/djimenez/iconv-go"
    "log"
    "os"
)

func failOnError(err error) {
    if err != nil {
        log.Fatal("Error:", err)
    }
}

func main() {
    // O_WRONLY:書き込みモード開く, O_CREATE:無かったらファイルを作成
    file, err := os.OpenFile("/tmp/people.csv", os.O_WRONLY|os.O_CREATE, 0600)
    failOnError(err)
    defer file.Close()

    err = file.Truncate(0) // ファイルを空っぽにする(2回目以降用)
    failOnError(err)

    converter, err := iconv.NewWriter(file, "utf-8", "sjis")
    failOnError(err)

    writer := csv.NewWriter(converter)
    writer.Write([]string{"山田", "20"})
    writer.Write([]string{"田中", "21"})
    writer.Write([]string{"佐藤", "22"})
    writer.Flush()
}

実行してみる

go run csv.go && open /tmp/people.csv

実行結果