標準パッケージのencoding/csvを使ってもいいですが、gocsvつかうとラク出来ますよ、という話。社内の業務アプリケーションだとデータをダウンロードしたい要求が強く、REST APIのレスポンス形式の一つとしてjsonとcsvみたいなケース、結構あります。

そんな時、jsonもcsvもGoの構造体(struct)で管理出来たら良いよねーと思って探していたら、上記のライブラリが見つかった次第。

使い方

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

が別途必要。

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

广告
将在 10 秒后关闭
bannerAds