LoginSignup
3
3

More than 3 years have passed since last update.

TSV,CSVファイルを読込んでみる

Last updated at Posted at 2019-10-09

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

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3