当前位置: 首页 > news >正文

go语言文件操作

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

// 从标准输入中查找重复的行
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.lryc.cn/news/319880.html

相关文章:

  • 七月论文审稿GPT第3.2版和第3.5版:通过paper-review数据集分别微调Mistral、gemma
  • QML 自定义时间编辑控件
  • 后端程序员入门react笔记(八)-redux的使用和项目搭建
  • 深度学习 精选笔记(13.2)深度卷积神经网络-AlexNet模型
  • 【C#图解教程】笔记
  • A Workload‑Adaptive Streaming Partitioner for Distributed Graph Stores(2021)
  • 鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Search)
  • GPIO八种工作模式实践总结
  • ElementUI两个小坑
  • 前端基础——HTML傻瓜式入门(2)
  • 操作系统(AndroidIOS)图像绘图的基本原理
  • 测试用例的设计(2)
  • HTML与CSS
  • App推广不再难!Xinstall神器助你快速获客,提升用户留存
  • MySQL建表以及excel内容导入
  • 让el-input与其他组件能够显示在同一行
  • 学完Efficient c++ (44-45)
  • 鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:ColumnSplit)
  • jenkins部署go应用 基于docker-compose
  • 【晴问算法】入门篇—贪心算法—整数配对
  • 九种背包问题(C++)
  • 008:安装Docker
  • STM32第九节(中级篇):RCC(第一节)——时钟树讲解
  • Web核心,HTTP,tomcat,Servlet
  • 空间(Space)概念:元素、集合、空间和数学对象
  • 【Datawhale组队学习:Sora原理与技术实战】训练一个 sora 模型的准备工作,video caption 和算力评估
  • Kafka-生产者报错javax.management.InstanceAlreadyExistsException
  • Java常见问题:编辑tomcat运行环境、部署若伊系统
  • 阿里云免费证书改为3个月,应对方法很简单
  • 安装Pytorch——CPU版本