GolangでShift_JIS(Windows31J)のファイルを読み込み
たどり着くまで時間がかかったのでメモ。
文字コードを意識しないファイルの読み込み
つまりはUTF-8のファイル。BOMはどうなんだろう?(試していない)
os.Openとbufio.NewReaderで行ごとに読み込める。
注意点: 読み込み完了時はerror
にio.EOFが入る。
package main import ( "bufio" "fmt" "io" "os" ) func main() { path := "/path/to/your/file" fp, err := os.Open(path) if err != nil { panic(err) } defer fp.Close() reader := bufio.NewReader(decoder.Reader(fp)) for { line, _, err := reader.ReadLine() if err == io.EOF { break } else if err != nil { panic(err) } fmt.Println(string(line)) } }
文字コードを考慮する。
とりあえずgolang decode
とかでググってみるとencodingパッケージが出てくる。
どうやらDecoder.ReaderでラップしたReaderが作れそう。
じゃあDecoderってどうやって作るの?と探したところ、japaneseパッケージにShiftJIS
を発見。
こいつがencoding.Encoding型なので、NewDecoder
メソッドを持っているらしい。
とりあえずjapanese
パッケージをゲット
go get golang.org/x/text/encoding/japanese
package main import ( "bufio" "fmt" "golang.org/x/text/encoding/japanese" "io" "os" ) func main() { path := "/path/to/your/file" fp, err := os.Open(path) if err != nil { panic(err) } defer fp.Close() decoder := japanese.ShiftJIS.NewDecoder() reader := bufio.NewReader(decoder.Reader(fp)) for { line, _, err := reader.ReadLine() if err == io.EOF { break } else if err != nil { panic(err) } fmt.Println(string(line)) } }
bufio.NewReader
に変換する前にデコードをはさめばOK
わかれば簡単。