Go语言中使用encoding/csv包读取CSV文件,支持整体读取、逐行解析、处理标题行及自定义分隔符。1. 用csv.NewReader()创建读取器,ReadAll()一次性读取所有记录;2. 大文件宜用Read()循环逐行读取,避免内存溢出;3. 可先读取首行作为header,后续每行映射为map[字段名]值,便于结构化访问;4. 支持设置Comma、Comment、FieldsPerRecord等参数以适配不同格式。该包高效灵活,适用于各类CSV数据处理场景。

在Go语言中,encoding/csv 包提供了读取和写入CSV(逗号分隔值)文件的功能。它属于标准库,无需额外安装,使用简单且高效。下面介绍如何使用该包读取并解析CSV文件。
要读取一个CSV文件,可以使用 csv.NewReader() 创建一个读取器,然后调用其 ReadAll() 或逐行读取 Read() 方法。
示例:读取整个CSV文件内容
package main
import (
"encoding/csv"
"log"
"os"
)
func main() {
// 打开CSV文件
file, err := os.Open("data.csv")
if err != nil {
log.Fatal(err)
}
defer file.Close()
// 创建CSV读取器
reader := csv.NewReader(file)
// 读取所有记录
records, err := reader.ReadAll()
if err != nil {
log.Fatal(err)
}
// 遍历每一行
for _, record := range records {
// record 是一个字符串切片,表示一行数据
for i, field := range record {
print(field)
if i < len(record)-1 {
print(",")
}
}
println()
}
}
当CSV文件较大时,一次性读取全部内容可能占用过多内存。此时应使用 Read() 方法逐行读取。
立即学习“go语言免费学习笔记(深入)”;
reader := csv.NewReader(file)
for {
record, err := reader.Read()
if err == io.EOF {
break
}
if err != nil {
log.Fatal(err)
}
// 处理单行数据
println(strings.Join(record, "|"))
}
这种方式适合处理大型CSV文件,避免内存溢出。
很多CSV文件第一行为字段名(标题行),我们可以先读取标题,再将后续每行映射为键值对。
header, err := reader.Read()
if err != nil {
log.Fatal(err)
}
for {
record, err := reader.Read()
if err == io.EOF {
break
}
if err != nil {
log.Fatal(err)
}
// 将每行转为 map[字段名]值
row := make(map[string]string)
for i, value := range record {
if i < len(header) {
row[header[i]] = value
}
}
// 使用 row 进行后续操作
println("Name:", row["name"], ", Age:", row["age"])
}
并非所有CSV都使用逗号作为分隔符,有些使用制表符或分号。可以通过设置 Comma 字段来自定义。
reader := csv.NewReader(file) reader.Comma = ';' // 设置分隔符为分号 reader.TrimLeadingSpace = true // 忽略字段前的空格
其他常用配置:
基本上就这些。通过 encoding/csv 可以灵活高效地处理各种CSV格式文件,结合文件操作即可完成导入、解析等常见任务。注意错误处理和资源释放,确保程序健壮性。
以上就是Golang如何使用encoding/csv读取CSV文件_Golang CSV文件读取与解析方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号