来世から頑張る!!

技術ブログを目指して

GolangでShift_JIS(Windows31J)のファイルを読み込み

たどり着くまで時間がかかったのでメモ。

文字コードを意識しないファイルの読み込み

つまりはUTF-8のファイル。BOMはどうなんだろう?(試していない)

os.Openbufio.NewReaderで行ごとに読み込める。

注意点: 読み込み完了時はerrorio.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
わかれば簡単。