#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
reader.LazyQuotes = true // ダブルクオートを厳密にチェックしない
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 !")
}