Go语言通过encoding/csv包可高效读取解析CSV文件。使用os.Open打开文件后,结合csv.NewReader逐行读取,适合大文件的流式处理;通过ReadAll()加载全部数据,适用于小文件。可将每行数据按索引映射到结构体字段,实现结构化存储。包原生支持处理含引号、逗号等特殊字符的字段,但需确保文件为UTF-8编码。正确处理错误和内存使用是关键。

在Go语言中读取和解析CSV文件非常简单,得益于标准库
encoding/csv
提供的强大支持。只需要结合
os
和
bufio
包,就能高效处理本地或网络中的CSV数据。下面通过几个常见场景,展示如何用Golang读取并解析CSV文件。
读取本地CSV文件
使用
os.Open
打开文件,配合
csv.NewReader
创建读取器,逐行读取内容。
示例代码:
package mainimport ( "encoding/csv" "fmt" "os")func main() { file, err := os.Open("data.csv") if err != nil { fmt.Println("打开文件失败:", err) return } defer file.Close() reader := csv.NewReader(file) records, err := reader.ReadAll() if err != nil { fmt.Println("读取CSV失败:", err) return } for _, record := range records { fmt.Println(record) }}
这段代码会将CSV每行解析为字符串切片。假设
data.csv
内容如下:
姓名,年龄,城市张三,25,北京李四,30,上海
输出结果为:
立即学习“go语言免费学习笔记(深入)”;
[姓名 年龄 城市][张三 25 北京][李四 30 上海]
按行流式读取大文件
对于较大的CSV文件,不建议使用
ReadAll()
一次性加载,应使用
Read()
逐行处理,节省内存。
reader := csv.NewReader(file)for { record, err := reader.Read() if err == io.EOF { break } if err != nil { fmt.Println("读取行出错:", err) return } fmt.Println(record)}
这种方式适合处理上万行的数据,避免内存溢出。
将CSV数据映射为结构体
实际开发中,通常需要把每行数据解析为结构体。虽然
csv.Reader
不直接支持自动绑定,但可以结合索引手动赋值。
示例:
type Person struct { Name string Age int City string}var people []Personrecords, _ := reader.ReadAll()for i, record := range records { if i == 0 { continue // 跳过表头 } age, _ := strconv.Atoi(record[1]) people = append(people, Person{ Name: record[0], Age: age, City: record[2], })}fmt.Println(people)
这样就能把CSV数据转换为结构化对象,便于后续处理或JSON输出。
处理带引号或特殊字符的字段
CSV标准支持字段中包含逗号、换行或引号,
encoding/csv
默认能正确解析这些内容,只要原始文件格式合规。
例如这一行:
"张,三","25,5","北京"
会被正确解析为三个字段:
张,三
、
25,5
、
北京
。
如果源数据编码不是UTF-8(如GBK),需先转码,Go标准库不支持自动识别非UTF-8编码。
基本上就这些。Golang处理CSV足够简洁,对大多数场景都够用。注意错误处理和内存使用,尤其是大文件场景。不复杂但容易忽略细节。
以上就是Golang读取CSV文件与解析示例的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1404649.html
微信扫一扫
支付宝扫一扫