Golang系列文章:读取并统计文件内容

Posted liuhe688

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang系列文章:读取并统计文件内容相关的知识,希望对你有一定的参考价值。

上次我们从命令行接收输入,并统计了每次输入内容出现的次数,今天对程序加以改造,使其能够读取文件内容,并统计每行文本出现的次数。

首先,我们把接收输入的逻辑封装成一个函数:

// scan.go

package main

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

func main() {
    counts := make(map[string]int)

    fmt.Printf("Please type in something:
")

    countLines(os.Stdin, counts)

    for line, n := range counts {
        fmt.Printf("%d : %s
", n, line)
    }
}

// 统计行数
func countLines(file *os.File, counts map[string]int) {
    input := bufio.NewScanner(file)

    for input.Scan() {
        line := input.Text()

        if line == "bye" {
            break
        }

        counts[line]++
    }
}

上面的coutLines函数有两个参数:file *os.Filecounts map[string]int,第一个参数可以接收标准输入或文件对象,第二个参数接收一个map引用。

然后,我们移除接收命令行输入的逻辑,替换为读取当前目录下的test.txt文件:

// scan.go

package main

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

func main() {
    counts := make(map[string]int)

    // 打开文件
    file, err := os.Open("test.txt")

    // 异常处理
    if err != nil {
        fmt.Fprintf(os.Stderr, "%v
", err)
        return
    }

    countLines(file, counts)

    // 关闭文件
    file.Close()

    for line, n := range counts {
        fmt.Printf("%d : %s
", n, line)
    }
}

// 统计行数
func countLines(file *os.File, counts map[string]int) {
    input := bufio.NewScanner(file)

    for input.Scan() {
        counts[input.Text()]++
    }
}

我们使用os.Open打开test.txt文件,如果出现异常,则进行异常处理,如果读取成功,则统计内容,最后关闭文件。

test.txt文件内容如下:

hello
world
hello

程序运行结果:

$ go run scan.go
# 输出内容
2 : hello
1 : world

除上述方式之外,我们还可以使用io/ioutil中的方法来读取文件,然后以换行符分割进行统计,实现代码如下:

// split.go

package main

import (
    "os"
    "fmt"
    "strings"
    "io/ioutil"
)

func main() {
    counts := make(map[string]int)

    // 读取文件
    data, err := ioutil.ReadFile("test.txt")

    // 异常处理
    if err != nil {
        fmt.Fprintf(os.Stderr, "%v
", err)
        return
    }

    // 将数据转换为字符串 然后以换行符分割
    lines := strings.Split(string(data), "
")

    for _, line := range lines {
        counts[line]++
    }

    for line, n := range counts {
        fmt.Printf("%d : %s
", n, line)
    }
}

以上是关于Golang系列文章:读取并统计文件内容的主要内容,如果未能解决你的问题,请参考以下文章

Golang系列文章:抓取网页内容

Golang 读取json文件,并解析结构体

Golang系列文章:正则表达式

在 Golang 中从 AWS S3 读取文件

使用Python读取markdown文件并统计字数

一行一行读取文件没有换行符golang