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

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

// 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.File 和 counts 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: 读取文件并统计内容的更多相关文章

  1. Python读取文件编码及内容

    Python读取文件编码及内容 最近做一个项目,需要读取文件内容,但是文件的编码方式有可能都不一样.有的使用GBK,有的使用UTF8.所以在不正确读取的时候会出现如下错误: UnicodeDecode ...

  2. python读取文件指定行内容

    python读取文件指定行内容 import linecache text=linecache.getline(r'C:\Users\Administrator\Desktop\SourceCodeo ...

  3. Objective-C:随机的读取文件中的内容

    可以通过改变当前文件的偏移量来实现文件的读取 -offsetInFile获取文件当前的位移量 -seekToFileOffset:(NSUInteger)length设置文件当前的位移量 -readD ...

  4. 在java中读取文件中的内容

    package shi; import java.io.*; public class wenjianIO { public static void main(String agrs[]){ File ...

  5. Python 读取文件下所有内容、获取文件名、截取字符、写回文件

    # coding=gbk import os import os.path   #读取目录下的所有文件,包括嵌套的文件夹 def GetFileList(dir, fileList): newDir ...

  6. Java 多线程读取文件并统计词频 实例 出神入化的《ThreadPoolExecutor》

    重在展示多线程ThreadPoolExecutor的使用,和线程同步器CountDownLatch,以及相关CAS的原子操作和线程安全的Map/队列. ThreadPool主线程 1 import j ...

  7. iOS案例:读取指定txt文件,并把文件中的内容输出出来

    用到的是NSString中的initWithContentsOfFile: encoding方法 // // main.m // 读取指定文件并输出内容 // // Created by Apple ...

  8. Python读取文件内容与存储

    Python读取与存储文件内容 一..csv文件 读取: import pandas as pd souce_data = pd.read_csv(File_Path) 其中File_path是文件的 ...

  9. PHP读取文件内容的方法

    下面我们就为大家详细介绍PHP读取文件内容的两种方法. 第一种方法:fread函数 <?php $file=fopen('1.txt','rb+'); echo fread($file,file ...

随机推荐

  1. [SDOI2018]物理实验 set,扫描线,旋转坐标系

    [SDOI2018]物理实验 set,扫描线,旋转坐标系 链接 loj 思路 先将导轨移到原点,然后旋转坐标系,参考博客. 然后分线段,每段的贡献(三角函数值)求出来,用自己喜欢的平衡树,我选set. ...

  2. 利用$a_n$与$S_n$的关系求通项$a_n$

    前言 由\(a_n\)与\(S_n\)的关系求数列\(\{a_n\}\)的通项公式,在求通项公式题型中占有比较大的份额,是一个重要的求解思路和方法.是要求重点掌握的类型. 一.方法依据 二者关系:\( ...

  3. C语言之symlink

    函数原型: #include <unistd.h> int symlink(const char * oldpath, const char * newpath); 函数说明: symli ...

  4. haproxy 配置文件详解 之 配置文件示例

    此示例文件在haproxy1.8.20 测试没有问题: global log 127.0.0.1 local0 info maxconn user nobody group nobody daemon ...

  5. 关于getClass(),Object.class,getClassLoader的理解

    1.对Class类的理解:Class类包含了类的信息,如构造方法.方法.属性,可用于反射.以下是所有方法 2.获取Class类对象的几种方法: Test test = new Test(); (1). ...

  6. Comet OJ - Contest #1 C 复读游戏(状态压缩)

    题意 https://www.cometoj.com/contest/35/problem/C?problem_id=1498 思路 这题要用到一种比较小众的状压方法(没见过的话可能一时比较难想到). ...

  7. 聊聊对称/非对称加密在HTTPS中的使用

    目前常用的加密算法主要分成三类: 对称加密算法 非对称加密算法 消息摘要算法 在互联网中,信息防护主要涉及两个方面:信息窃取和信息篡改.对称/非对称加密算法能够避免信息窃取,而消息摘要算法能够避免信息 ...

  8. nginx+keepalived高可用及双主模式【h】

    高可用有2中方式. 1.Nginx+keepalived 主从配置 这种方案,使用一个vip地址,前端使用2台机器,一台做主,一台做备,但同时只有一台机器工作,另一台备份机器在主机器不出现故障的时候, ...

  9. 【免费视频】使用VS Code开发ASP.NET Core WebAPI应用程序

    1.使用VS Code开发ASP.NET Core WebAPI应用程序 1.使用Visual Studio Code开发Asp.Net Core基础入门实战 毕竟从.net过度过来的我们已经习惯了使 ...

  10. A Philosophy of Software Design

    关于复杂性,尚无统一的定义,从不同的角度可以给出不同的答案.可以用数量来度量,比如芯片集成的电子器件越多越复杂(不一定对):按层次性[2]度量,复杂度在于层次的递归性和不可分解性.在信息论中,使用熵来 ...