Go
CSV

gocsvを使ってラクにCSVファイルをつくる

More than 1 year has passed since last update.

標準パッケージの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を結構使ってるので、パフォーマンスに気を遣っている方は自前実装したほうが良いかと思いますー。