Shift_JISで書かれたtsvファイルの読込み処理をGOで書いてみました。
iconv-go を利用してみる[失敗編]
UTF-8で記述されたtsv/csvファイルを読込む場合、encoding/csv
のみで対応できるのであるが、Shift_JISで記述されている場合、そのままだと文字化けを起こしてしまう。
そこで、パッケージを利用したのですが、うまくいかなかったた。
main.go
package main
import (
"encoding/csv"
"io"
"os"
iconv "github.com/djimenez/iconv-go"
)
func main() {
file, err := os.Open("XXXX.tsv")
if err != nil {
panic(err)
}
defer file.Close()
// shif-jisの場合には以下の処理を追加
converter, err := iconv.NewReader(file, "sjis", "utf-8")
if err != nil {
panic(err)
}
//reader := csv.NewReader(file)
reader := csv.NewReader(converter)
// デリミタ設定(TSVなら\t, CSVなら,)
reader.Comma = '\t'
// コメント設定(コメント文字を指定)
reader.Comment = '#'
// ダブルクオートを厳密にチェックしない
reader.LazyQuotes = true
var line []string
for {
line, err = reader.Read() // 1行読み出し
if err == io.EOF {
break
} else if err != nil {
fmt.Println("読み込みエラー: ", line)
panic(err)
}
// ここに処理を追記する
}
}
##エラー内容
なぜか、TSVファイルの15行目を読込むと、以下のエラーが発生する。
panic: The storage control blocks were destroyed.
15行目の内容を削除し、1行詰めても同じ場所でエラーが発生する。
原因が不明だったためパッケージを変更することに。
text/transform を利用してみる[成功編]
main.go
package main
import (
"encoding/csv"
"io"
"os"
"golang.org/x/text/encoding/japanese"
"golang.org/x/text/transform"
)
func main() {
file, err := os.Open("XXXX.tsv")
if err != nil {
panic(err)
}
defer file.Close()
// shif-jisの場合には以下の処理を追加
converter := transform.NewReader(file, japanese.ShiftJIS.NewDecoder())
//reader := csv.NewReader(file) // 取込ファイルがUTF8の場合、こっち
reader := csv.NewReader(converter)
// デリミタ設定(TSVなら\t, CSVなら,)
reader.Comma = '\t'
// コメント設定(コメント文字を指定)
reader.Comment = '#'
// ダブルクオートを厳密にチェックしない
reader.LazyQuotes = true
var line []string
for {
line, err = reader.Read() // 1行読み出し
if err == io.EOF {
break
} else if err != nil {
fmt.Println("読み込みエラー: ", line)
panic(err)
}
// ここに処理を追記する
}
}
こちらの方法だと問題なくtsvファイルを読込めた。