search
LoginSignup
42

More than 3 years have passed since last update.

posted at

updated at

Organization

Go言語でCSVを書き出す!エクセル用のSJIS版も!

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

実行結果

Screen Shot 2013-12-12 at 22.00.59.png

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
What you can do with signing up
42