hakeの日記

Windows環境でプログラミングの勉強をしています。

Go言語 - Shift_JISファイルの読み書き

Windowsでの使用ではSJISのテキストを扱うことが多くなります。SJISファイルの読み書きには以下のパッケージを使用します。

入手先

https://github.com/golang/text

参考サイトとパッケージのパス?が違うので注意。

旧
"code.google.com/p/go.text/encoding/japanese"
"code.google.com/p/go.text/transform"

新
"golang.org/x/text/encoding/japanese"
"golang.org/x/text/transform"

サンプル

package main

import (
    "golang.org/x/text/encoding/japanese"
    "golang.org/x/text/transform"
    "bufio"
    "fmt"
//  "io"
    "os"
)

func main() {
    var fp *os.File
    var err error

//  var byteBuf   []byte
//  var tooLong   bool

    //
    // Shift_JISファイルを読み込み
    //
    fp, err = os.Open("SJIS.txt")
    if err != nil {
        panic(err)
    }
//  defer fp.Close()

    sjisScanner  := bufio.NewScanner(transform.NewReader(fp, japanese.ShiftJIS.NewDecoder()))

    // 1行ずつ処理
    for sjisScanner.Scan() {
        fmt.Println(sjisScanner.Text())  // コマンドプロンプトにはShift_JISに自動でエンコードされる
    }

//  sjisReader  := bufio.NewReader(transform.NewReader(fp, japanese.ShiftJIS.NewDecoder()))
    // 1行ずつ処理
//  for {
//      byteBuf, tooLong, err := sjisReader.ReadLine()
//      if err == io.EOF {
//          break
//      } else if err != nil {
//          panic(err)
//      }
//      if tooLong {
//          panic("***Line is too Long!!***")
//      }
//      str := string(byteBuf)
//      fmt.Println(str)  // コマンドプロンプトにはShift_JISに自動でエンコードされる
//  }
    fp.Close()



    //
    // Shift_JISでファイルに書き込み
    //
    fp, err = os.OpenFile("SJIS2.txt", os.O_CREATE|os.O_WRONLY, 0666)
    if err != nil {
        panic(err)
    }
    defer fp.Close()
    sjisWriter  := bufio.NewWriter(transform.NewWriter(fp, japanese.ShiftJIS.NewEncoder()))

    // 以下エラー処理省略
    _, err = sjisWriter.WriteString("SJIJライトデータ1行目\n")
    _, err = sjisWriter.WriteString("SJIJライトデータ2行目\n")
    err    = sjisWriter.Flush()

//  fp.Close()

}