標準パッケージのencoding/csv
を使ってもいいですが、gocsvつかうとラク出来ますよ、という話。社内の業務アプリケーションだとデータをダウンロードしたい要求が強く、REST APIのレスポンス形式の一つとしてjsonとcsvみたいなケース、結構あります。
そんな時、jsonもcsvもGoの構造体(struct)で管理出来たら良いよねーと思って探していたら、上記のライブラリが見つかった次第。
使い方
main.go
package main
import (
"fmt"
"os"
"github.com/gocarina/gocsv"
)
type Client struct { // 構造体にcsvタグをつける、これがCSVに出力される際のタイトルになる
Id string `json:"id" csv:"id"`
Name string `json:"name" csv:"名前"`
Age string `json:"age" csv:"年齢"`
}
func main() {
clients := []*Client{}
clients = append(clients, &Client{Id: "12", Name: "John", Age: "21"}) // Add clients
clients = append(clients, &Client{Id: "13", Name: "Fred"})
file, _ := os.OpenFile("sample.csv", os.O_RDWR|os.O_CREATE, os.ModePerm)
defer file.Close()
// csvファイルを書き出し
gocsv.MarshalFile(&clients, file)
// ファイルではなく文字書き出しをする場合
// csvStr, err := gocsv.MarshalString(&clients)
}
これでCSVファイルの作成ができる。かんたーん。
sjis化
まあ大体の一般利用者はCSVはエクセルで開くわけで。SJIS化は必須なわけで。
そんなときはSetCSVWriter
で設定を上書きしてあげる。
- golang.org/x/text/encoding/japanese
- golang.org/x/text/transform
が別途必要。
main.go
pakcage main
import (
"encoding/csv"
"io"
"golang.org/x/text/encoding/japanese"
"golang.org/x/text/transform"
"github.com/gocarina/gocsv"
)
func main() {
...
// SetCSVWriterでオーバーライド
gocsv.SetCSVWriter(func(out io.Writer) *csv.Writer {
return csv.NewWriter(transform.NewWriter(out, japanese.ShiftJIS.NewEncoder()))
})
...
gocsv.MarshalFile(&data, file)
}
こんな感じ、注意点としては内部的にreflectを結構使ってるので、パフォーマンスに気を遣っている方は自前実装したほうが良いかと思いますー。