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ファイルを読込めた。