LoginSignup
48
42

More than 3 years have passed since last update.

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

Last updated at Posted at 2013-12-12

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

48
42
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
48
42