如何使用Golang读取CSV文件_解析表格和数据文件

21次阅读

go标准库encoding/csv包可高效读取csv文件:先用csv.NewReader包装文件,逐行Read()获取字段切片;需手动映射表头到结构体字段,处理bom、空行、字段缺失及类型转换;支持自定义分隔符、流式处理和并发解析。

如何使用Golang读取CSV文件_解析表格和数据文件

Go语言标准库中的encoding/csv包提供了简洁、高效的方式读取CSV文件,无需第三方依赖。关键在于正确处理文件打开、编码、字段分隔、换行和错误边界。

基础读取:逐行解析CSV内容

使用csv.NewReader包装*os.File或任意io.Reader,调用Read()逐行获取[]String切片(每行字段)。

  • 确保以只读方式打开文件:os.Open("data.csv")
  • defer file.Close()及时释放资源
  • reader.Read()返回一行数据,返回io.EOF表示结束
  • 注意:默认以逗号分隔,支持带引号字段和换行符(如”hello
    world”)

结构化解析:将CSV映射到Go结构体

标准库不直接支持结构体自动绑定,需手动按列赋值。推荐先读取表头(第一行),再用map[string]int建立列名→索引映射,提升可维护性。

  • 调用一次reader.Read()获取header切片
  • 遍历header构建字段名到下标的映射,例如colIndex["name"] = 0
  • 后续每行用该映射安全取值:row[colIndex["email"]]
  • 对数字、布尔等类型做显式转换(如strconv.Atoi),并检查错误

处理常见问题编码、空行与错误容错

真实CSV常含BOM头、空行、缺失字段或类型错误。需主动应对:

立即学习go语言免费学习笔记(深入)”;

  • 读取前跳过UTF-8 BOM:bytes.TrimPrefix(buf, []byte("xefxbbxbf"))
  • 忽略空行:if len(row) == 0 { continue }
  • 字段数不匹配时,用len(row)判断是否截断或补默认值
  • 关键字段缺失或转换失败时,记录日志或跳过该行,避免panic

进阶技巧:流式处理大文件与自定义分隔符

对于GB级CSV,避免全量加载;可结合bufio.Scanner或设置reader.FieldsPerRecord增强校验。

  • csv.NewReader(bufio.NewReader(file))减少系统调用开销
  • reader.Comma = 't'支持TSV;设reader.TrimLeadingSpace = true自动去首尾空格
  • 启用严格模式reader.FieldsPerRecord = -1允许每行字段数不同;设为正整数则校验一致性
  • 配合goroutine + channel实现并发解析(注意共享reader需加锁或拆分Reader)
text=ZqhQzanResources