Go

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

実行結果

Screen Shot 2013-12-12 at 22.00.59.png