Golang中读写CSV文件的全面指南

CSV(逗号分隔值)文件是一种常见的数据存储格式,广泛应用于数据导入、导出、分析和交换等场景。在Golang中,有许多库和工具可以帮助我们读取和写入CSV文件,使数据处理变得简单而高效。本文将深入探讨如何在Golang中使用标准库以及第三方库来读写CSV文件。

一、Golang标准库的CSV处理

Golang的标准库encoding/csv包提供了一组功能强大而灵活的API,用于读取和写入CSV文件。我们可以通过下面的步骤来使用标准库处理CSV文件:

  1. 导入encoding/csv包:首先,我们需要在代码中导入encoding/csv包,通过import "encoding/csv"语句实现。

  2. 创建CSV Reader:使用标准库中的csv.NewReader()函数创建一个CSV Reader对象。我们需要传递一个io.Reader对象作为参数,该对象通常是一个文件。

file, err := os.Open("data.csv")
if err != nil {fmt.Println("打开文件失败:", err)return
}
defer file.Close()reader := csv.NewReader(file)

在上述代码中,我们使用os.Open()函数打开一个名为data.csv的文件,并将其传递给csv.NewReader()函数创建一个CSV Reader对象。注意,我们需要在读取文件后记得关闭文件,以防止资源泄露。

  1. 读取CSV记录:通过CSV Reader对象的Read()方法来迭代读取CSV文件中的记录。每次调用Read()方法,它会返回一个记录以及可能出现的错误。
for {record, err := reader.Read()if err == io.EOF {break}if err != nil {fmt.Println("读取记录失败:", err)return}// 处理记录
}

在上述代码中,我们使用一个无限循环来持续读取CSV记录,直到遇到文件结束(EOF)为止。每次调用Read()方法,它会返回一个字符串切片,其中每个元素都是CSV记录的一个字段。最后,我们可以在循环中对记录进行处理,如打印、解析等。

  1. 写入CSV记录:如果我们想将数据写入CSV文件,则需要创建一个CSV Writer对象,并使用其Write()方法写入记录。
file, err := os.Create("output.csv")
if err != nil {fmt.Println("创建文件失败:", err)return
}
defer file.Close()writer := csv.NewWriter(file)
defer writer.Flush()record := []string{"Alice", "21", "F"}
err = writer.Write(record)
if err != nil {fmt.Println("写入记录失败:", err)return
}

在上述代码中,我们使用os.Create()函数创建一个名为output.csv的文件,并将其传递给csv.NewWriter()函数创建一个CSV Writer对象。类似于读取CSV文件时,我们需要在写入结束时关闭文件和刷新缓冲区,以确保数据被正确写入。

二、使用第三方库处理CSV文件

除了标准库之外,还有许多第三方库可以在Golang中处理CSV文件。这些库通常提供更多功能和灵活性,使CSV文件的处理更加高效和方便。下面介绍两个受欢迎的第三方库:

1. Gocarina/gocsv

Gocarina/gocsv是一个功能强大的CSV处理库,提供了读取、写入和转换CSV文件的能力。它具有以下特点:

  • 支持高级功能:包括自定义类型映射、标记解析、选择性解析等。
  • 具有更好的性能:相对于标准库,Gocarina/gocsv提供了更好的性能和效率。
  • 简单易用:提供了一组简洁明了的API,使CSV文件的处理变得简单易用。

要使用Gocarina/gocsv库,您需要按照以下步骤进行设置:

  1. 安装Gocarina/gocsv库:在终端中执行以下命令安装Gocarina/gocsv库。

    go get github.com/Gocarina/gocsv
    
  2. 导入所需的包:在代码中导入github.com/Gocarina/gocsv和其他所需的包。

    import ("github.com/Gocarina/gocsv""os"
    )
    
  3. 创建结构体:使用结构体定义CSV文件中的记录结构。

    type Person struct {Name   string `csv:"name"`Age    int    `csv:"age"`Gender string `csv:"gender"`
    }
    

    在上面的示例中,我们定义了一个名为Person的结构体,其中的字段使用csv标签指定了他们在CSV文件中对应的列名。

  4. 读取CSV文件:使用gocsv.UnmarshalFile函数从CSV文件中读取记录。

    file, err := os.OpenFile("data.csv", os.O_RDWR|os.O_CREATE, os.ModePerm)
    if err != nil {fmt.Println("打开文件失败:", err)return
    }
    defer file.Close()var people []*Person
    if err := gocsv.UnmarshalFile(file, &people); err != nil {fmt.Println("读取文件失败:", err)return
    }
    

    在上述代码中,我们使用os.OpenFile函数打开一个名为data.csv的文件,并将其传递给gocsv.UnmarshalFile函数来读取CSV记录。通过传递一个指向记录切片的指针,我们可以将文件中的记录存储在people变量中。

  5. 写入CSV文件:使用gocsv.MarshalFile函数将记录写入CSV文件。

    file, err := os.OpenFile("output.csv", os.O_RDWR|os.O_CREATE, os.ModePerm)
    if err != nil {fmt.Println("创建文件失败:", err)return
    }
    defer file.Close()people := []*Person{{Name: "Alice", Age: 21, Gender: "F"},{Name: "Bob", Age: 25, Gender: "M"},
    }
    if err := gocsv.MarshalFile(&people, file); err != nil {fmt.Println("写入文件失败:", err)return
    }
    

    在上述代码中,我们使用os.OpenFile函数创建一个名为output.csv的文件,并将其传递给gocsv.MarshalFile函数来写入CSV记录。通过传递一个记录切片的指针,我们可以将记录写入文件中。

Gocarina/gocsv还提供了其他一些方便的功能,例如选择性解析、自定义类型映射、标记解析等,使CSV文件的处理更加灵活和便捷。

2. GoCSV

GoCSV是另一个流行的CSV处理库,提供了丰富的功能和灵活性。它具有以下特点:

  • 支持读取和写入CSV文件:GoCSV提供了直观且易于使用的API来读取和写入CSV文件。
  • 提供行级别的操作:可以对每行数据进行操作,例如过滤、更新、删除等。
  • 支持自定义解析器和写入器:允许您创建自定义的解析器和写入器,以符合特定的需求。

要使用GoCSV库,您需要按照以下步骤进行设置:

  1. 安装GoCSV库:在终端中执行以下命令安装GoCSV库。

    go get github.com/gocarina/gocsv
    
  2. 导入所需的包:在代码中导入github.com/gocarina/gocsv和其他所需的包。

    import ("github.com/gocarina/gocsv""os"
    )
    
  3. 创建结构体:使用结构体定义CSV文件中的记录结构。

    type Person struct {Name   string `csv:"name"`Age    int    `csv:"age"`Gender string `csv:"gender"`
    }
    

    在上面的示例中,我们定义了一个名为Person的结构体,其中的字段使用csv标签指定了他们在CSV文件中对应的列名。

  4. 读取CSV文件:使用gocsv.UnmarshalFile函数从CSV文件中读取记录。

    file, err := os.OpenFile("data.csv", os.O_RDWR|os.O_CREATE, os.ModePerm)
    if err != nil {fmt.Println("打开文件失败:", err)return
    }
    defer file.Close()var people []*Person
    if err := gocsv.UnmarshalFile(file, &people); err != nil {fmt.Println("读取文件失败:", err)return
    }
    

    在上述代码中,我们使用os.OpenFile函数打开一个名为data.csv的文件,并将其传递给gocsv.UnmarshalFile函数来读取CSV记录。通过传递一个指向记录切片的指针,我们可以将文件中的记录存储在people变量中。

  5. 写入CSV文件:使用gocsv.MarshalFile函数将记录写入CSV文件。

    file, err := os.OpenFile("output.csv", os.O_RDWR|os.O_CREATE, os.ModePerm)
    if err != nil {fmt.Println("创建文件失败:", err)return
    }
    defer file.Close()people := []*Person{{Name: "Alice", Age: 21, Gender: "F"},{Name: "Bob", Age: 25, Gender: "M"},
    }
    if err := gocsv.MarshalFile(&people, file); err != nil {fmt.Println("写入文件失败:", err)return
    }
    

    在上述代码中,我们使用os.OpenFile函数创建一个名为output.csv的文件,并将其传递给gocsv.MarshalFile函数来写入CSV记录。通过传递一个记录切片的指针,我们可以将记录写入文件中。

GoCSV还提供了其他一些方便的功能,如行级操作、自定义解析器和写入器等,使CSV文件的处理更加灵活和强大。

案例

下面我将给您提供 3 个使用 Gocarina/gocsv 库和 GoCSV 库处理 CSV 文件的案例。

案例1:读取和打印 CSV 文件中的记录

下面是一个使用 Gocarina/gocsv 库读取 data.csv 文件,并打印出每一条记录的示例:

package mainimport ("encoding/csv""fmt""os""github.com/Gocarina/gocsv"
)type Person struct {Name   string `csv:"name"`Age    int    `csv:"age"`Gender string `csv:"gender"`
}func main() {file, err := os.OpenFile("data.csv", os.O_RDWR|os.O_CREATE, os.ModePerm)if err != nil {fmt.Println("打开文件失败:", err)return}defer file.Close()var people []*Personif err := gocsv.UnmarshalFile(file, &people); err != nil {fmt.Println("读取文件失败:", err)return}for _, p := range people {fmt.Println("Name:", p.Name)fmt.Println("Age:", p.Age)fmt.Println("Gender:", p.Gender)fmt.Println("--------")}
}

案例2:将结构体切片写入 CSV 文件

下面是一个使用 Gocarina/gocsv 库将结构体切片写入 output.csv 文件的示例:

package mainimport ("encoding/csv""fmt""os""github.com/Gocarina/gocsv"
)type Person struct {Name   string `csv:"name"`Age    int    `csv:"age"`Gender string `csv:"gender"`
}func main() {file, err := os.OpenFile("output.csv", os.O_RDWR|os.O_CREATE, os.ModePerm)if err != nil {fmt.Println("创建文件失败:", err)return}defer file.Close()people := []*Person{{Name: "Alice", Age: 21, Gender: "F"},{Name: "Bob", Age: 25, Gender: "M"},}if err := gocsv.MarshalFile(&people, file); err != nil {fmt.Println("写入文件失败:", err)return}fmt.Println("写入成功!")
}

案例3:使用 GoCSV 库进行行级操作

下面是一个使用 GoCSV 库进行行级操作的示例,将具有特定条件的记录写入 filtered.csv 文件中:

package mainimport ("encoding/csv""fmt""os""github.com/gocarina/gocsv"
)type Person struct {Name   string `csv:"name"`Age    int    `csv:"age"`Gender string `csv:"gender"`
}func main() {file, err := os.OpenFile("data.csv", os.O_RDWR|os.O_CREATE, os.ModePerm)if err != nil {fmt.Println("打开文件失败:", err)return}defer file.Close()var people []*Personif err := gocsv.UnmarshalFile(file, &people); err != nil {fmt.Println("读取文件失败:", err)return}filteredPeople := make([]*Person, 0)for _, p := range people {if p.Age >= 18 && p.Gender == "F" {filteredPeople = append(filteredPeople, p)}}filteredFile, err := os.OpenFile("filtered.csv", os.O_RDWR|os.O_CREATE, os.ModePerm)if err != nil {fmt.Println("创建文件失败:", err)return}defer filteredFile.Close()if err := gocsv.MarshalFile(&filteredPeople, filteredFile); err != nil {fmt.Println("写入文件失败:", err)return}fmt.Println("写入成功!")
}

这些案例涵盖了使用 Gocarina/gocsv 库和 GoCSV 库进行 CSV 文件处理的常见场景。您可以根据自己的需求进行相应的调整和修改。希望对您有所帮助!

三、总结

CSV文件是一种常见的数据存储格式,在许多场景下被广泛使用。在Golang中,我们可以使用标准库以及一些第三方库来读取和写入CSV文件。标准库encoding/csv提供了简单而高效的API来处理CSV文件,而第三方库如Gocarina/gocsvGoCSV提供了更多的功能和灵活性,使CSV文件的处理更加便捷和强大。

无论选择使用哪个库,重要的是根据需要选择最合适的工具来处理CSV文件。这将根据项目的要求、性能需求以及个人或团队的偏好来决定。以上介绍的是Golang中常用的CSV处理方法,希望对您有所帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于单片机体温脉搏检测控制系统及源程序

一、系统方案 1、本设计采用51单片机作为主控器。 2、DS18B20传感器检测体温。 3、红外对接管采集心率值送到液晶1602显示。 二、硬件设计 原理图如下: 三、单片机软件设计 1、首先是系统初始化 /lcd1602初始化设置*/ void init_1602() { write_com(0x38); //显示…

苍穹外卖项目笔记(2)

1 Nginx 反向代理和负载均衡 1.1 概念 【Tips】可以看到前端请求地址和后端接口地址并不匹配,这里涉及到 nginx 反向代理 ,就是将前端发送的动态请求由 nginx 转发到后端服务器 使用 nginx 作反向代理的好处: 提高访问速度(在请…

系列一、堆里面的分区:Eden、From、To、老年代各自的特点

一、堆里面的分区:Eden、From、To、老年代各自的特点 堆是对象共享的区域,也是垃圾回收器主要工作的地方。主要分为新生区、养老区和元空间,而这三块地方中GC主要工作在新生区和养老区,其中新生区占1/3、养老区占2/3,新…

开源与闭源软件的辩论:对大模型技术发展的影响

目录 前言1 开源软件的优缺点1.1 开源软件的优点1.2 开源软件的缺点和挑战 2 闭源软件的优缺点2.1 闭源软件的优点2.2 闭源软件的缺点和挑战 3 大模型发展会走向哪一边结语 前言 近期,特斯拉CEO马斯克公开表示:OpenAI不该闭源,自家首款聊天机…

Qt http

文章目录 前言1. 定义的接口2.connect信号槽3. get4. get 下载文件5. post 总结 前言 /* 1.请求报文: 请求报文是由客户端发送给服务器,用于请求特定资源或执行特定操作。它由以下几个部分组成: 请求行:描述了请求的方法、目标资源…

海外代理IP如何找到靠谱的?

现在市面上有很多代理服务商,大家可以根据自己的需求选择一个适合自己业务的的IP代理服务商,现在也有一些免费的,但如果力求稳定安全,还是选择付费的。 这里提醒一句,在买代理IP时最好找这种可以免费试用的&#xff0…

虾皮台湾站点如何选品

在互联网时代,电商平台成为了越来越多人购物的首选。虾皮作为台湾地区最大的电商平台之一,为商家提供了良好的销售渠道。然而,在虾皮上选择适合的商品对于商家来说并不容易。本文将介绍如何通过虾皮选品工具-知虾来查看台湾地区各大类目的热销…

⑩⑤【DB】详解MySQL存储过程:变量、游标、存储函数、循环,判断语句、参数传递..

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ MySQL存储过程 1. 介绍2. 使用3. 变量①系统变…

Polygon zkEVM协议治理、升级及其流程

1. 引言 随着Polygon社区开发者和内部团队的测试深入,当前版本的Polygon zkEVM不可避免地需更新和某些升级。 为激励开发者对Polygon zkEVM做battle-test,已启动了bug-bounty: Rewards by Threat Level 由于zk-Rollup生态系统还处于萌芽阶…

【libGDX】ApplicationAdapter生命周期

1 前言 libGDX 中,用户自定义的渲染窗口需要继承 ApplicationAdapter 类,ApplicationAdapter 实现了 ApplicationListener 接口,但实现的方法都是空方法,方法释义如下。 public interface ApplicationListener {// 应用首次创建时…

sql注入 [极客大挑战 2019]HardSQL1

打开题目 输入1或者1",页面均回显NO,Wrong username password!!! 那我们输入1 试试万能密码 1 or 11 # 输入1 and 12 # 输入1 union select 1,2,3 # 输入1 ununionion seselectlect 1,2,3 # 输入1 # 输入1# 页面依旧回…

在Ubuntu上用sane api实现通用扫描功能

最近由于工作需要,要写一套扫描相关的接口。 在这里记录一下,实现还有有点复杂的。 目录 依赖 主要功能 初始化 获取当前扫描仪列表 打开扫描仪 sane_open 设置扫描选项 sane_control_option 扫描 关闭设备 结束使用 参考资料 依赖 sudo a…

极域电子教室-教师机无法找到学生机

软件环境 极域电子教室2016 V6豪华版 场景还原 因为某软件安装闪退,只能使用自己的电脑进行控制演示,故拔掉原来教室机的网线。 恢复网络后,发现控屏软件无法找到台下的任何学生机。 PS: 拔掉网线前还是可以控制学生机 原因排查 1、网…

操作系统(六)| 文件系统下 文件使用 共享 保护

目录 4 空闲存储空间的管理 4.1 空闲区表 4.2 空闲块链 4.3 位图 5 文件的使用 6 文件共享 6.1 普通的文件共享方法 6.1.1 按路径名访问共享文件 6.1.2 链接法 6.1.3 基本文件目录BFD 6.2 基于I节点的文件共享方法(Unix采用) 6.2.1 硬链接 6…

transformer学习资料

一、NLP 自然语言处理 NLP 是机器学习在语言学领域的研究,专注于理解与人类语言相关的一切。NLP 的目标不仅是要理解每个单独的单词含义,而且也要理解这些单词与之相关联的上下文之间的意思。 常见的NLP 任务列表: 对整句的分类&#xff1…

课程32:.Net Core Web API部署IIS

这里写目录标题 🚀前言前言一、服务器环境配置1.1 安装 ASP.NET Core模块/托管捆绑包1.2 检查是否安装成功二、项目发布2.1 选择发布方式2.2 发布配置2.3 发布三、服务器部署3.1 IIS添加网站3.2 数据库链接配置3.3 让IIS支持.NET Web Api3.4 验证四、最后🚀前言 本文是《.…

Vue.js2+Cesium1.103.0 十四、绘制视锥,并可实时调整视锥姿态

Vue.js2Cesium1.103.0 十四、绘制视锥&#xff0c;并可实时调整视锥姿态 Demo <template><divid"cesium-container"style"width: 100%; height: 100%;"><divclass"control"style"position: absolute;right: 50px;top: 50px…

【周报2023-11-17】

周报2023-11-17 本周的主要工作下周的工作内容 本周的主要工作 本周的主要工作的话主要是小程序页面的搭建 那截止到目前也就是今天为止的话&#xff0c;小程序的主题页面已完成百分之80% 那剩下的话就是一些细节性的问题&#xff1a;例如说首页的三张图片是一个动态轮播动画 …

SpringBoot中文乱码问题解决方案

在Spring Boot中&#xff0c;确实没有像传统Web应用程序中需要使用web.xml配置文件。对于中文乱码问题&#xff0c;你可以采取以下几种方式来解决&#xff1a; 在application.properties文件中添加以下配置&#xff1a; spring.http.encoding.charsetUTF-8 spring.http.encod…

基于轻量级yolov5的瓷砖瑕疵检测系统

该专栏仅支持购买本专栏的同学学习使用,不支持以超级会员、VIP等形式使用,请谅解!【购买专栏后可选择其中一个完整源码项目】 本文是我新开设的专栏《完整源码项目实战》 的第十二篇全源码文章,包含数据集在内的所有资源,可以实现零基础上手入门学习。前面系列文章链接如下…