跳到主要内容

CSV

CSV 是记录格式,不是简单的逗号分隔字符串。encoding/csv 能正确处理引号、逗号、嵌入换行和转义;不要用 strings.Split 代替。

读取和写入

package main

import (
"encoding/csv"
"fmt"
"io"
"strings"
)

func main() {
reader := csv.NewReader(strings.NewReader("id,name\n1,\"Ada, Lovelace\"\n"))
for {
record, err := reader.Read()
if err == io.EOF {
break
}
if err != nil {
panic(err)
}
fmt.Println(record)
}
}

默认情况下 Reader 会检查每行字段数;固定列格式可设置 FieldsPerRecord,动态列格式则要在业务层明确缺失和多余字段。写入使用 csv.Writer,结束时必须调用 Flush 并检查 Error

输入边界与兼容性

对上传文件设置总大小、单行长度和记录数限制。明确字符编码、表头是否必需、空字段含义、时区和数字精度;CSV 本身没有类型系统,所有字段都需要业务转换和校验。

常见错误

  • 用字符串分割处理含引号或换行的字段。
  • 忽略 ReadWriteFlushError
  • 未限制上传文件大小或单行长度。
  • 把字段解析成功当作业务校验成功。
  • 未定义表头、空字段和编码规则。

小结

  • 使用 encoding/csv 处理语法,不手写分隔逻辑。
  • 读取和写入都要检查错误,外部输入必须限制大小。
  • CSV 的字段类型、兼容性和空值语义需要业务契约定义。