返回介绍

08.5.1 逐行读取文本文件

发布于 2024-08-14 12:50:32 字数 3865 浏览 0 评论 0 收藏 0

逐行读取文本文件是最常用的方式。这也是我们首先介绍它的原因。byLine.go程序分为三部分,将帮助你理解这个技巧。

byLine.go第一部分代码如下:

package main

import (
    "bufio"
    "flag"
    "fmt"
    "io"
    "os"
)

引入bufio包表示我们将使用缓冲区输入。

func lineByLine(file string) error {
    var err error

    f, err := os.Open(file)
    if err != nil {
        return err
    }
    defer f.Close()

    r := bufio.NewReader(f)
    for {
        line, err := r.ReadString('\n')
        if err == io.EOF {
            break
        } else if err != nil {
            fmt.Printf("error reading file %s", err)
            break
        }
        fmt.Printf(line)
    }
    return nil
}

所有的实现都在lineByLine()函数中。在确保可以打开指定的文件名进行读取之后,你调用bufio.NewReader()创建一个新的读实例,然后你可以调用bufio.ReadString()逐行读取文件。行分隔符通过bufio.ReadString()参数指定,它指示bufio.ReadString()一直读取,直到碰到行分隔符为止。当参数是换行符时,不断调用bufio.ReadString()会逐行读取输入文件!注意,使用fmt.Print()而不是fmt.Println()输出读取行,说明每个输入行中都包含了换行符。

byLine.go第三部分代码如下:

func main() {
    flag.Parse()
    if len(flag.Args()) == 0 {
        fmt.Printf("usage: byLine <file1> [<file2> ...]\n")
        return
    }

    for _, file := range flag.Args() {
        err := lineByLine(file)
        if err != nil {
            fmt.Println(err)
        }
    }
}

执行byLine.go,并使用wc(1)处理输出会产生如下的输出内容:

$ go run byLine.go /tmp/swtag.log /tmp/adobegc.log | wc
        4761   88521   568402

如下的命令会校验前述输出的精确性:

$ wc /tmp/swtag.log /tmp/adobegc.log
         131     693     8440     /tmp/swtag.log
        4630   87828   559962     /tmp/adobegc.log
        4761   88521   568402     total

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文