码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-09-06 14:49:01      阅读:529      评论:0      收藏:0      [点我收藏+]

标签:关闭   int   news   .text   lan   方式   替换   print   spl   

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

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

// scan.go

package main

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

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

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

    countLines(os.Stdin, counts)

    for line, n := range counts {
        fmt.Printf("%d : %s\n", 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\n", err)
        return
    }

    countLines(file, counts)

    // 关闭文件
    file.Close()

    for line, n := range counts {
        fmt.Printf("%d : %s\n", 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\n", err)
        return
    }

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

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

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

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

标签:关闭   int   news   .text   lan   方式   替换   print   spl   

原文地址:https://www.cnblogs.com/liuhe688/p/9597741.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!