デフォルトで用意されている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
実行結果