Go 用 encoding/csv 读 CSV 字段错乱因未处理 header,需先读 header 建 map[string]int 映射;写 CSV 中文乱码需加 UTF-8 BOM(\uFEFF);转 Excel 必须用第三方库如 excelize;大文件须流式处理防内存溢出。

用 encoding/csv 读 CSV 时字段顺序错乱?
Go 标准库不自动识别 CSV 头行,csv.NewReader 默认按列索引取值,没手动跳过 header 或映射字段就会错位。
- 必须先调用
reader.Read()读一次 header 行,再用map[string]int建立字段名→列索引映射 - 后续每行数据用该 map 查列号,避免硬编码索引(比如
row[2])导致加列后崩溃 - 注意:header 行可能含空格或 BOM,建议用
strings.TrimSpace清理键名
写 CSV 时中文乱码或 Excel 打不开?
Excel 默认用 ANSI(如 GBK)打开无 BOM 的 UTF-8 文件,直接写 utf-8 会导致中文显示为方块。
- 解决方案:在 CSV 内容开头写入 UTF-8 BOM ——
\uFEFF,即[]byte{0xEF, 0xBB, 0xBF} - 不要用
os.Create后直接csv.NewWriter,得先写 BOM 再把 writer 绑定到带 BOM 的*os.File - 若目标系统是 Linux/macOS,可跳过 BOM;但只要涉及 Excel,BOM 是刚需
想把 CSV 转成 Excel(.xlsx),能不用第三方库吗?
不能。encoding/csv 只读写 CSV,Go 标准库完全不支持 Excel 格式解析或生成。
-
github.com/xuri/excelize/v2是目前最稳的选择,支持 .xlsx 读写、样式、公式,且纯 Go 实现无 CGO - 别用
tealeg/xlsx(已归档)、也别碰带 CGO 的库(如依赖 libxlsxwriter),部署和交叉编译会踩坑 - 转换逻辑本质是:CSV → struct 切片 → 遍历写入
excelize.File.SetCellValue,注意行列索引从 1 开始(不是 0)
处理大 CSV 文件内存爆掉?
一次性 ReadAll 会把整个文件加载进内存,百万行 CSV 很容易吃光 GB 级内存。
立即学习“go语言免费学习笔记(深入)”;
- 必须流式处理:用
for record, err := reader.Read(); err == nil; record, err = reader.Read()循环读 - 写 Excel 时也别攒满再写,每写 1000 行调一次
f.Save()或用f.WriteTo分批输出 - 如果只是清洗/过滤,用
bufio.Scanner配合strings.Split比csv.Reader更省内存(但要自己处理引号、换行等 CSV 边界)










