go语言文件操作

news/2024/4/29 9:26:45

标准流的操作
从标准输入中查找重复的行

// 从标准输入中查找重复的行
func main() {counts := make(map[string]int, 0)scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() {counts[scanner.Text()]++}for key, value := range counts {if value > 1 {fmt.Println("输出======",key)}}
}

命令行输入和输出(需要等一定超时时间才能输出,可以按control+D发送中断信号可直接输出并结束)

123
123
3
1
1
输出====== 123
输出====== 1

文件操作

下面文件名scanner.go

func main() {cmdArgs := os.Args[1:]files := make([]*os.File, 0) for _, path := range cmdArgs {// 打开文件,以读写方式打开,如果没有则创建file, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0777)if err != nil {fmt.Println("打开文件失败:", path,"失败原因:", err)return}// 收集文件指针files = append(files, file)}// 文件名-总行数映射,文件名-去重行数映射,文件名-去重行映射allLineCountMap, distinctLineCountMap, distinctLineMap := FileLineCount(files)// 遍历打印结果for _, file := range files {fmt.Println("文件名:", file.Name(), " 行数:", allLineCountMap[file.Name()], " 去重行数:",distinctLineCountMap[file.Name()], "去重行:")for _, line :=range distinctLineMap[file.Name()] {fmt.Println(line)}}
}// 文件统计,总行数,去重行数,去重行
func FileLineCount(files []*os.File) (allLineCountMap map[string]int, distinctLineCountMap map[string]int, distinctLineMap map[string][]string) {// 固定缓冲区大小,用来读文件bytes := make([]byte, 512, 512)// 文件结尾会返回io.EOF固定错误,用来判断文件遍历完成var err error// 文件名对应字节数组映射fileNameToByteMap := make(map[string][]byte, 0)// 遍历文件数组for _, file := range files {n := 0err = nilfileByte := make([]byte, 0, 1024)for err != io.EOF {// n是读取到了多少个字节,err是本次读取的错误信息n, err = file.Read(bytes)if n > 0 {fileByte = append(fileByte, bytes[0:n]...)// 清空bytes数组for i := 0; i < n; i++ {bytes[i] = 0}} else {fileNameToByteMap[file.Name()] = fileByte}if err == io.EOF {// 读文件结束,跳出内层循环break}}}allLineCountMap = make(map[string]int, 0)distinctLineCountMap = make(map[string]int, 0)distinctLineMap = make(map[string][]string, 0)// 读文件字节数组,统计行数for fileName, fileBytes := range fileNameToByteMap {// 字节数组按照\n分割lines := strings.Split(string(fileBytes), "\n")// 统计总行数allLineCountMap[fileName] = len(lines)// 统计去重行数distinctMap := make(map[string]int, 0)for _, line := range lines {distinctMap[line]++}distinctLines := make([]string, 0, len(distinctLineMap))for key := range distinctMap {distinctLines = append(distinctLines, key)}distinctLineCountMap[fileName] = len(distinctMap)distinctLineMap[fileName] = distinctLines}return
}

使用

  1. 创建测试文件text1.txt
流程1
流程1a
a
  1. 创建测试文件text2.txt
123
123
123
123
123
123
123
123
123
  1. 执行go build scanner.go,生成scanner可执行文件
  2. 执行./scanner ./text1.txt ./text2.txt(目录需要改成自己的)
  3. 执行结果
文件名: ./text1.txt  行数: 5  去重行数: 3 去重行:
流程1a
文件名: ./text2.txt  行数: 9  去重行数: 1 去重行:
123

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.cpky.cn/p/10673.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

自学黑客(网络安全)技术——2024最新

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

基于matlab使用 fmincon 函数来进行有约束条件的最小化问题求解

一、一般步骤 生成带有噪声的正态分布数据&#xff1b;定义拟合模型。 model (params, x) normpdf(x, params(1), params(2)); 初始参数猜测 initial_guess [mu, sigma]; 设置约束条件 lb [0, 0]; % 参数的最小值 ub [10, 10]; % 参数的最大值 定义优化问题 opts …

Unload-labs

function checkFile() {var file document.getElementsByName(upload_file)[0].value;if (file null || file "") {alert("请选择要上传的文件!");return false;}//定义允许上传的文件类型var allow_ext ".jpg|.png|.gif";//提取上传文件的类…

【MySQL基础】MySQL基础操作二

文章目录 &#x1f34e;1.数据库约束&#x1f350;约束类型&#x1f346;1.1NOT NULL&#x1f346;1.2UNIQUE&#x1f346;1.3DEFAULT&#x1f346;1.4PRIMARY KEY&#x1f346;1.5FOREIGN KEY &#x1f34f;2.查询操作&#x1f35f;2.1聚合查询&#x1f354;2.1.1聚合函数&…

九、软考-系统架构设计师笔记-软件可靠性基础知识

1、软件可靠性概念 软件可靠性定义 软件可靠性(Software Reliability)是软件产品在规定的条件下和规定的时间区间完成规定功能的能力。 规定的条件是指直接与软件运行相关的使用该软件的计算机系统的状态和软件的输入条件&#xff0c;或统称为软件运行时的外部输入条件。规定…

【开源】SpringBoot框架开发房屋出售出租系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 房屋销售模块2.2 房屋出租模块2.3 预定意向模块2.4 交易订单模块 三、系统展示四、核心代码4.1 查询房屋求租单4.2 查询卖家的房屋求购单4.3 出租意向预定4.4 出租单支付4.5 查询买家房屋销售交易单 五、免责说明 一、摘…