Go语言逐行读取文件

时间:2022-06-01 14:15:17

使用Go语言逐行读取文件,最简单的方法是使用 bufio.Scanner

常规做法

简单示例:

package main

import (
    "bufio"
    "fmt"
    "log"
    "os"
)

func main() {
    file, err := os.Open("/path/to/file.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    scanner := bufio.NewScanner(file)
    // 注意,如果读取的行长度超过64k,则会报错
    for scanner.Scan() {
        fmt.Println(scanner.Text())
    }

    if err := scanner.Err(); err != nil {
        log.Fatal(err)
    }
}

字符串长度超出64K

Scan在行超过 65536 个字符时出错。如果知道行长度大于 64K,可以使用 Buffer() 方法来增加Scan的容量。

添加Buffer的示例:

package main

import (
    "bufio"
    "fmt"
    "log"
    "os"
)

func main() {
    file, err := os.Open("/path/to/file.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    scanner := bufio.NewScanner(file)

    const maxCapacity = longLineLen  // 需要的容量
    buf := make([]byte, maxCapacity)
    scanner.Buffer(buf, maxCapacity)
    for scanner.Scan() {
        fmt.Println(scanner.Text())
    }

    if err := scanner.Err(); err != nil {
        log.Fatal(err)
    }
}

使用Buffer核心代码是:

buf := make([]byte, maxCapacity)
scanner.Buffer(buf, maxCapacity)