Golang CSV文件处理
我在用Golang处理CSV文件时遇到几个问题:
- 读取包含中文的CSV文件时出现乱码,该如何正确设置编码?
- 处理大型CSV文件(超过100MB)时内存占用过高,有没有高效的流式读取方法?
- 写入CSV时如何自动处理包含逗号或换行符的字段?
- 标准库encoding/csv和第三方库(如gocsv)哪个更适合实际项目?
希望能得到有实际项目经验的前辈指点,最好能提供示例代码。
2 回复
使用Golang处理CSV文件,推荐使用标准库encoding/csv。
主要方法:
csv.NewReader()读取文件csv.NewWriter()写入文件- 支持自定义分隔符、逗号转义等
示例:逐行读取并解析CSV数据,或写入切片数据到CSV。
注意处理编码和字段引号。
更多关于Golang CSV文件处理的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go语言中处理CSV文件可以使用标准库 encoding/csv,以下是常见操作示例:
1. 读取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 := csv.NewReader(file)
records, err := reader.ReadAll()
if err != nil {
panic(err)
}
for _, row := range records {
for _, col := range row {
fmt.Printf("%s ", col)
}
fmt.Println()
}
}
2. 写入CSV文件
func writeCSV() {
file, err := os.Create("output.csv")
if err != nil {
panic(err)
}
defer file.Close()
writer := csv.NewWriter(file)
defer writer.Flush()
data := [][]string{
{"Name", "Age", "City"},
{"John", "23", "New York"},
{"Jane", "27", "London"},
}
for _, row := range data {
err := writer.Write(row)
if err != nil {
panic(err)
}
}
}
3. 常用配置选项
reader := csv.NewReader(file)
reader.Comma = ';' // 设置分隔符(默认逗号)
reader.Comment = '#' // 设置注释标识符
reader.FieldsPerRecord = 3 // 设置每行期望的字段数
writer := csv.NewWriter(file)
writer.Comma = '\t' // 设置制表符分隔
4. 逐行读取(大文件优化)
func readLargeCSV() {
file, _ := os.Open("large.csv")
defer file.Close()
reader := csv.NewReader(file)
for {
record, err := reader.Read()
if err == io.EOF {
break
}
if err != nil {
panic(err)
}
fmt.Println(record)
}
}
注意事项:
- 始终检查错误处理
- 使用
defer确保文件正确关闭 - 大文件建议使用
Read()逐行读取 - 可通过
reader.FieldsPerRecord验证数据完整性
需要处理特殊格式(如引号、换行符)时,库会自动处理符合RFC 4180标准的格式。

