在 Go (Golang) 中处理 CSV:解析、写入与数据处理
CSV(逗号分隔值)是交换表格数据最常用的格式之一。在 Go (Golang) 中,通过标准包 encoding/csv 原生实现了 CSV 处理,使其成为一个方便且高效的工具。在本文中,我们将详细讲解如何在 Go 中读取、创建和处理 CSV 文件,包括处理大量数据、配置分隔符以及错误处理。
encoding/csv 包:基础
encoding/csv 包提供了两个主要类型:用于读取 CSV 的 Reader 和用于写入的 Writer。它支持标准的 CSV 规则(RFC 4180),并允许灵活配置参数,例如分隔符、注释和引号处理。
要开始使用,只需导入该包:
import "encoding/csv"读取 CSV 文件
让我们看一个逐行读取 CSV 文件的最简单示例:
package main
import ( "encoding/csv" "fmt" "os")
func main() { // 打开文件 file, err := os.Open("data.csv") if err != nil { panic(err) } defer file.Close()
// 创建 Reader reader := csv.NewReader(file)
// 读取所有记录 records, err := reader.ReadAll() if err != nil { panic(err) }
// 输出数据 for i, record := range records { fmt.Printf("行 %d: %v", i, record) }}重要提示: ReadAll() 会将整个文件加载到内存中。对于大文件,请使用 Read() 进行逐行读取。
逐行读取大型 CSV 文件
为了处理大量数据(GB 级别),请使用迭代读取:
reader := csv.NewReader(file)for { record, err := reader.Read() if err != nil { // 文件结束 if err.Error() == "EOF" { break } panic(err) } // 处理记录 fmt.Println(record)}写入 CSV 文件
创建 CSV 文件同样直观:
package main
import ( "encoding/csv" "os")
func main() { file, err := os.Create("output.csv") if err != nil { panic(err) } defer file.Close()
writer := csv.NewWriter(file) defer writer.Flush() // 重要:刷新缓冲区
// 写入标题行 writer.Write([]string{"Name", "Age", "City"}) // 写入数据 writer.Write([]string{"Alice", "30", "Moscow"}) writer.Write([]string{"Bob", "25", "Saint Petersburg"})}不要忘记在所有写入操作后调用 Flush(),否则数据可能会丢失。
配置分隔符和其他参数
默认使用逗号,但您可以更改分隔符,例如改为分号(TSV 使用制表符):
reader := csv.NewReader(file)reader.Comma = ';' // 对于 TSV:'\\t'
// 对于写入:writer := csv.NewWriter(file)writer.Comma = ';'其他有用的参数:
- LazyQuotes — 允许在非标准位置使用引号(默认为
false) - FieldsPerRecord — 检查字段数量(负值禁用检查)
- Comment — 注释字符(例如
'#'),以该字符开头的行将被跳过 - TrimLeadingSpace — 自动删除字段开头的空格
带配置的示例:
reader := csv.NewReader(file)reader.Comma = '\\t'reader.Comment = '#'reader.TrimLeadingSpace = true错误处理与验证
CSV 文件通常包含错误:多余的引号、字段数量不匹配等。