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

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

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

// 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)
    }
}

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

时间: 2024-11-09 00:53:55

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

Java基础-输入输出-2.编写IoDemo.java的Java应用程序,程序完成的功能是:首先读取text.txt文件内容,再通过键盘输入文件的名称为iodemo.txt,把text.txt的内容存入iodemo.txt

2.编写IoDemo.java的Java应用程序,程序完成的功能是:首先读取text.txt文件内容,再通过键盘输入文件的名称为iodemo.txt,把text.txt的内容存入iodemo.txt package Test03; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import jav

第九章 显示、读取或拼接文件内容:cat命令

第九章 显示.读取或拼接文件内容:cat命令 名字解释 cat命令 连接文件并打印到标准输出设备上,cat经常用来显示文件的内容,类似于linux下的type命令. 注意:当文件较大时,文本在屏幕上迅速闪过(滚屏),用户往往看不清所显示的内容,因此一般用more等命令分屏显示.为了控制滚屏,可以按ctrl+S键,停止滚屏:按ctrl+Q键可以恢复滚屏.按ctrl+C键可以中断该命令的执行,并且返回shell提示符状态. 语法 cat (选项) (参数) 选项 -n或--number:显示所有输出

Linux统计文件内容

wc:统计文件的行数.单词数.字节数(word count) - wc char.txt:统计出文件char.txt的换行符个数.单词数.字节数 (char.txx有14行.13个单词.66字节) - wc -l char.txt:只统计行数(换行符个数) - wc -w char.txt:只统计单词数 - wc -c char.txt:只统计字节数(1byte=8bit) - wc -m char.txt:只统计字符数(UTF-8编码下,1汉字占3字节,1换行符占1字节) 原文地址:https

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

今天写个简单的程序,根据指定的URL来抓取相应的网页内容,然后存入本地文件.这个程序会涉及到网络请求和文件操作等知识点,下面是实现代码: // fetch.go package main import ( "os" "fmt" "net/http" "io/ioutil" ) func main() { url := os.Args[1] // 根据URL获取资源 res, err := http.Get(url) if er

读取txt内文件内容

命令如下: f = open("c:\\1.txt","r")  lines = f.readlines()#读取全部内容  for line in lines      print line 实例 如下: f = open("D:\\Python project\\Part 1\\script\\user.txt","r")lines=f.readlines()for line in lines:    print (lin

编写IoDemo.java的Java应用程序,程序完成的功能是:首先读取text.txt文件内容,再通过键盘输入文件的名称为iodemo.txt,把text.txt的内容存入iodemo.txt

package zuoye; import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream; public class IoDemo { public static void main(String[] args) { File file = new File("d:/zuoye"); if(!file.exists()) { file.mkdirs(); } File f=new

Golang系列文章:正则表达式

上次我们写了个并发程序,来抓取几个站点的网页内容,其中使用到了正则表达式来获取站点的域名部分,作为文件名存储本地文件,今天,我们就来总结一下正则表达式的常用方法. 首先,在Go语言中,正则表达式相关的操作都封装在regexp这个包中,所以使用前需要引入该包. 下面我们来写个最简单的案例: // regexp.go package main import ( "fmt" "regexp" ) func main() { // 是否匹配指定规则 isMatch, _ :

Golang系列文章:打印命令行参数

记得最早在学校机房学习Java时,写一个最简单main方法,当程序运行并在屏幕上打印出hello world时,内心还有些小激动呢,相信很多人都有这种经历吧.今天想借助命令行程序,总结一下Go语言的基础知识点. 首先,来一个Go语言版的hello world: // hello.go package main import "fmt" func main() { fmt.Println("hello world") } 我们可以直接在命令行执行下面的命令来运行该程序

Golang系列:其他常见的文件操作

在前面两篇中,我们介绍了常用的文件读写操作,今天接着来研究一下,其他一些常见的文件操作. 首先是创建目录: package main import ( "fmt" "os" ) // 显示文件信息 func printFileInfo(info os.FileInfo) { fmt.Printf("name: %v \n", info.Name()) fmt.Printf("size: %v \n", info.Size())