Go (Golang) 中的 CSV 操作:完全指南
CSV(逗号分隔值)是交换表格数据最常用的格式之一。在 Go (Golang) 语言中,CSV 操作通过标准包 encoding/csv 实现。它提供了方便且高效的接口用于读取和写入 CSV 文件,支持分隔符设置、字符转义和错误处理。
在本文中,我们将通过实际示例详细解析 encoding/csv 包的所有功能。您将学习如何逐行或整体读取 CSV 文件、写入数据、配置解析参数以及处理常见错误。
安装与导入
encoding/csv 包是 Go 标准库的一部分,因此无需额外安装。只需在代码中导入即可使用:
import ( "encoding/csv" "fmt" "os")读取 CSV 文件
读取 CSV 最简单的方法是使用 csv.NewReader 和 ReadAll 方法,该方法以字符串切片的形式返回所有记录。
func readAllExample(filename string) { file, err := os.Open(filename) if err != nil { panic(err) } defer file.Close()
reader := csv.NewReader(file) records, err := reader.ReadAll() if err != nil { panic(err) }
for _, record := range records { fmt.Println(record) }}对于大文件,最好使用 Read 方法逐行读取,以避免将整个文件加载到内存中:
func readLineByLine(filename string) { file, err := os.Open(filename) if err != nil { panic(err) } defer file.Close()
reader := csv.NewReader(file) reader.LazyQuotes = true // 允许宽松的引号解析
for { record, err := reader.Read() if err != nil { break // 文件结束或出错 } fmt.Println(record) }}写入 CSV 文件
写入数据使用 csv.NewWriter。Write 方法写入一条记录,WriteAll 方法一次性写入所有记录。别忘了调用 Flush() 刷新缓冲区。
func writeExample(filename string) { file, err := os.Create(filename) if err != nil { panic(err) } defer file.Close()
writer := csv.NewWriter(file) defer writer.Flush()
data := [][]string{ {"姓名", "年龄", "城市"}, {"安娜", "28", "莫斯科"}, {"伊万", "35", "圣彼得堡"}, }
for _, record := range data { if err := writer.Write(record); err != nil { panic(err) } }}设置分隔符和转义
默认情况下,encoding/csv 使用逗号作为分隔符,双引号用于转义。您可以通过 Reader 和 Writer 结构体的字段更改这些设置:
func customSettings() { // 读取 TSV(制表符分隔值) file, _ := os.Open("data.tsv") defer file.Close()
reader := csv.NewReader(file) reader.Comma = '\\t' // 使用制表符代替逗号 reader.Comment = '#' // 忽略以 # 开头的行
records, _ := reader.ReadAll() fmt.Println(records)}有用的配置字段:
Comma— 分隔符字符(默认为 ',')Comment— 注释字符(以此字符开头的行将被忽略)LazyQuotes— 允许宽松的引号解析TrimLeadingSpace— 删除字段开头的空格FieldsPerRecord— 期望的字段数量