Help us understand the problem. What is going on with this article?

[Golang] ファイル読み込みサンプル

はじめに

Golangのファイル読み込みをまとめました。バージョンは1.11.2で確認しました。

os.File Read使用

os.Openでファイルのオープンで取得したos.FileオブジェクトのReadメソッドを使用して読み込みを行います。
Readメソッドの引数に指定した[]byteスライスに内容が読み込まれます。

func useFileRead(fileName string) {
    fp, err := os.Open(fileName)
    if err != nil {
        panic(err)
    }
    defer fp.Close()

    buf := make([]byte, 64)
    for {
        n, err := fp.Read(buf)
        if n == 0 {
            break
        }
        if err != nil {
            panic(err)
        }
        fmt.Println(string(buf))
    }
}

ioutil.ReadFile使用

ioutil.ReadFileメソッドを使用してファイルを読み込みます。一度に全データを取得するのでファイルサイズが大きい場合は注意が必要ですが、記述量は少なくて済むのが利点です。

func useIoutilReadFile(fileName string) {
    bytes, err := ioutil.ReadFile(fileName)
    if err != nil {
        panic(err)
    }

    fmt.Println(string(bytes))
}

bufio.NewReaderSize使用

bufio.NewReaderSizeを使用してファイルを1行ごと読み込みます。1行のサイズが第二引数で指定したサイズを超える場合には、戻り値のisPrefixにfalseが返却されます。

func useBufioNewReaderSize(fileName string) {
    fp, err := os.Open(fileName)
    if err != nil {
        panic(err)
    }
    defer fp.Close()

    reader := bufio.NewReaderSize(fp, 64)
    var tmp []byte
    for {
        line, isPrefix, err := reader.ReadLine() // size を超えるとisPrefixがfalse
        if err == io.EOF {
            break
        }
        if err != nil {
            panic(err)
        }
        tmp = append(tmp, line...)
        if !isPrefix {
            fmt.Println(string(tmp))
            tmp = nil
        }
    }
}

bufio.NewScanner使用

bufio.NewScannerを使用してファイルを1行ごと読み込みます。bufio.NewReaderSizeを使用した場合と比べてシンプルに書けます。

func useBufioScanner(fileName string) {
    fp, err := os.Open(fileName)
    if err != nil {
        panic(err)
    }
    defer fp.Close()

    scanner := bufio.NewScanner(fp)
    for scanner.Scan() {
        fmt.Println(scanner.Text())
    }
}

csv.NewReader

csv.NewReaderを使用してcsvファイルを1行ごと読み込みます。csv.NewReaderを呼ぶとcsv.Readerが返却されます。csv.ReaderのCommaに区切り文字を指定すると指定した文字列でデータを分割します。デフォルトは","です。csv.ReaderのReaderメソッドを呼び出すと1行分の分割されたデータがスライスで返却されます。

func userCsvNewReader(fileName string) {
    fp, err := os.Open(fileName)
    if err != nil {
        panic(err)
    }
    defer fp.Close()

    reader := csv.NewReader(fp)
    //reader.Comma = ','
    reader.LazyQuotes = true
    for {
        record, err := reader.Read()
        if err == io.EOF {
            break
        } else if err != nil {
            panic(err)
        }
        fmt.Println(record)
    }
}
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした