golangでCSVパース

Excelから書き出したCSVをパースするというよく有るやつをGolangでやってみました。

|名前| email| 年齢|
|山田太郎| yamada@hoge.com| 20|
|鈴木一郎| suzuki@hoge.com| 30|
|田中花子| tanaka@hoge.lcom| 40|

こんな表を作ってCSVで保存する。
MacのExcelで保存すると改行コードがCRなのでCRLFにしておく。
go.textパッケージでSJISからUTF-8に変換するのでgo getしておく。
文字コードを変換するライブラリはいくつかあったが、中には機種依存文字の変換でエラーになるものもあったので注意

$ go get code.google.com/p/go.text/encoding
$ go get code.google.com/p/go.text/encoding/japanese
package main

import (
	"os"
	"encoding/csv"
	"io"
	"fmt"

	"code.google.com/p/go.text/encoding/japanese"
	"code.google.com/p/go.text/transform"
)

func main(){
	// CSVファイルの読み込み
	file, err := os.Open("./sample.csv")
	if err != nil{
		panic(err)
	}
	defer file.Close()

	// 読み込んだファイルをSJISからUTF8にコンバート
	converter := transform.NewReader(file, japanese.ShiftJIS.NewDecorder())

	// ループで回しつつ1行づつ読み込む 	
	csvReader := csv.NewReader(converter)
	for{
		line, err := csvReader.Read()
		// 終端に達したらループを抜ける
		if err == io.EOF{
			break
		}
		if err != nil{
			panic(err)
		}

		for i:=0; i < len(line); i+=1 {
			fmt.Printf("%s\n", line[i])
		}
		fmt.Printf("\n\n")

	}
}

実行すると

$ go run sample.go
名前
email
年齢

山田太郎
yamada@hoge.com
20

鈴木一郎
suzuki@hoge.com
30

田中花子
tanaka@hoge.lcom
40