LoginSignup
36
31

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-09-29

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

36
31
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
31