Go言語でCSVの読み書き(sjis、euc、utf8対応)

  • 32
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Go言語でCSVファイルの読み書き

このサンプルで詰まっている要素

  • CSVファイル入出力(CRLF、デリミタ指定)
  • 文字コード変換
  • 引数
  • ログ出力
  • スライス処理
  • 数値→文字列変換

カラムが2つ以上あるsjisなcsvファイルを用意してください。

csv.go
/*
GOROOT、GOPATHの設定を忘れずに
例) GOROOT=c:\tools\go
    GOPATH=c:\tools\go
    PATH=c:\tools\go\bin

最初にパッケージのダウンロードとインストール
c:\>go version
go version go1.4.2 windows/amd64

go get golang.org/x/text/encoding/japanese
go get golang.org/x/text/transform

go run csv.go "入力ファイル.csv" "出力ファイル名.csv"
go build csv.go 
*/
package main

import (
    "golang.org/x/text/encoding/japanese"
    "golang.org/x/text/transform"
    "encoding/csv"
    "io"
    "flag"
    "log"
    "os"
    "fmt"
)

func failOnError(err error) {
    if err != nil {
        log.Fatal("Error:", err)
    }
}

func main() {
    flag.Parse()

    //読み込みファイル準備
    file1, err := os.Open(flag.Arg(0))
    failOnError(err)
    defer file1.Close()

    //書き込みファイル準備
    file2, err := os.Create(flag.Arg(1))
    failOnError(err)
    defer file2.Close()

    reader := csv.NewReader(transform.NewReader(file1, japanese.ShiftJIS.NewDecoder()))
//  reader := csv.NewReader(transform.NewReader(file1, japanese.EUCJP.NewDecoder()))
//  reader := csv.NewReader(file1) //utf8

    writer := csv.NewWriter(transform.NewWriter(file2, japanese.ShiftJIS.NewEncoder()))
//  writer := csv.NewWriter(transform.NewWriter(file2, japanese.EUCJP.NewEncoder()))
//  writer := csv.NewWriter(file2) //utf8
    writer.UseCRLF = true //デフォルトはLFのみ
//  writer.Comma = '\t'

    log.Printf("Start")
    for {
        record, err := reader.Read() // 1行読み出す
        if err == io.EOF {
            break
        } else {
            failOnError(err)
        }
        var new_record []string
        for i, v := range record {
            if i > 0 {
                new_record = append(new_record, fmt.Sprint(i) + ":" + v)
            }
        }
        writer.Write(new_record) // 1行書き出す
//      log.Printf("%#v", record[0] + "," + record[1])
    }
    writer.Flush()
    log.Printf("Finish !")
}