如何使用Golang读取CSV文件_Golang encoding/csv CSV解析示例


csv.NewReader必须传入io.Reader接口类型,如*os.File;不可直接传字符串路径。需先os.Open再defer Close,支持HTTP响应等各类io.Reader。ReadAll适合小文件,Read循环适合大文件和细粒度错误处理。

csv.NewReader 读取文件时必须传入 *os.File 或 io.Reader

直接传入文件路径字符串会编译失败,csv.NewReader 只接受实现了 io.Reader 接口的类型。常见错误是写成 csv.NewReader("data.csv"),这会报错 cannot use "data.csv" (type string) as type io.Reader

  • 正确做法:先用 os.Open 打开文件,得到 *os.File(它实现了 io.Reader
  • 别忘了用 defer f.Close(),否则文件句柄泄漏
  • 如果数据来自 HTTP 响应体、bytes.Buffer 或 strings.Reader,同样可直接传入 —— 它们都满足 io.Reader

ReadAll 和逐行 Read 的选择取决于内存与错误处理需求

ReadAll 会一次性把整个 CSV 加载进内存并返回 [][]string,适合小文件且不关心某一行出错时继续解析的场景;而用循环调用 Read 可以逐行处理、及时响应错误、控制内存占用。

  • ReadAll 遇到任何解析错误(如引号不匹配、字段数不一致)就直接返回错误,不提供出错行号
  • Read 循环时,每行返回 []string,错误只影响当前行,可通过 csv.ParseError 类型断言获取 LineField 位置
  • 大文件(>100MB)务必避免 ReadAll,否则可能 OOM

设置 Comma 和 TrimLeadingSpace 处理常见格式变体

默认分隔符是英文逗号 ,,但实际 CSV 可能用制表符、分号甚至中文顿号;另外 Excel 导出的 CSV 常在字段前带空格,不处理会导致字段值开头多出空格。

  • 修改分隔符:reader.Comma = '\t'(制表符)或 reader.Comma = ';'
  • 自动裁剪字段首尾空格:reader.TrimLeadingSpace = true(注意:只裁前导空格,不裁结尾)
  • 若需裁剪结尾空格,得手动对每行字段调用 strings.TrimSpace
  • 注意:这些设置必须在第一次调用 ReadReadAll 之前完成
package main

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

func main() {
	f, err := os.Open("users.csv")
	if err != nil {
		panic(err)
	}
	defer f.Close()

	reader := csv.NewReader(f)
	reader.Comma = ','           // 可省略,默认就是 ,
	reader.TrimLeadingSpace = true

	records, err := reader.ReadAll()
	if err != nil {
		if e, ok := err.(*csv.ParseError); ok {
			fmt.Printf("parse error at line %d, field %d: %v\n", e.Line, e.Field, e.Err)
		} else {
			panic(err)
		}
		return
	}

	for i, record := range records {
		if i == 0 {
			continue // skip header
		}
		name := strings.TrimSpace(record[0])
		email := strings.TrimSpace(record[1])
		fmt.Printf("User %d: %s <%s>\n", i, name, email)
	}
}
CSV 解析真正麻烦的不是读取本身,而是字段里嵌了换行符、双引号、逗号却没被正确转义 —— 这类问题不会在 OpenNewReader 阶段暴露,只会在 Read 时触发 csv.ParseError,而且错误信息里的 Line 是逻辑行号(含跨行字段),不是文件字节偏移,调试时容易误判。


# excel  # go  # golang  # 字节  # csv  # ai  # csv文件  # 内存占用  # String  # 字符串  # 循环  # 接口  # http  # 行号  # 会在  # 实现了  # 大文件  # 分隔符  # 句柄  # 这类  # 英文  # 别忘了  # 报错 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: 如何使用Golang理解结构体指针方法接收者_Golang修改字段实践  微信JSAPI支付回调PHP怎么接收_处理JSAPI异步通知数据方法【指南】  c++怎么使用std::tuple存储多元组数据_c++ 11获取元素与解包操作【技巧】  C#如何使用Channel C#通道实现异步通信  用Python构建微服务架构实践_FastAPI与Django对比详解  windows如何修改文件默认打开方式_windows设置程序关联教程  如何在包含多值的列中精准搜索指定演员?  php中$this和::能混用吗_对象与静态作用域冲突解决【方法】  Python网络日志追踪_请求定位解析【教程】  如何在 Go 中可靠地测试含 time.Time 字段的结构体  Mac如何调整Dock栏大小和位置_Mac程序坞个性化设置  如何在Golang中使用time处理时间_Golang time时间解析与格式化方法  使用类变量定义字符串常量时的类型安全最佳实践  Windows10如何更改系统字体大小_Win10辅助功能文本缩放设置  php下载安装选zip还是msi格式_两种安装包对比【教程】  c++怎么实现大文件的分块读写_c++ 文件指针seekp与seekg偏移控制【方法】  Python 中将 ISO 8601 时间戳转换为日期并计算日期差值的完整教程  Win11系统更新后黑屏怎么办 Win11更新黑屏修复教程【方法】  Python日志系统设计与实现_高可观测性架构实战  Windows系统文件被保护机制阻止怎么办_权限不足错误处理方案  PythonPandas数据分析项目教程_时间序列透视表应用  Win11任务栏怎么固定应用 Win11将软件图标固定到底部【步骤】  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  Django 密码修改后会话失效的解决方案  如何在Golang中定义接口_抽象方法和多态实现  Win11怎么设置组合键快捷方式_Windows11自定义快捷键操作  Windows任务计划服务异常原因_任务调度失败的处理方案  Win10怎么卸载剪映_Win10彻底卸载剪映方法【步骤】  Win11如何设置文件权限 Win11 NTFS文件夹所有权与安全设置【高级】  微信里的php文件怎么变mp4_微信接收php转mp4操作步骤【操作】  Golang如何遍历目录文件_Golang filepath.Walk目录遍历操作方法  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  XML的“混合内容”是什么 怎么用DTD或XSD定义  如何在Golang中处理URL参数_Golang URL参数解析与路由映射方法  Windows10如何重置此电脑_Windows10电脑重置方法【步骤】  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  Mac如何整理桌面文件_Mac使用堆栈功能一键整理  c++ stringstream用法详解_c++字符串与数字转换利器  php订单日志怎么记录发货_php记录订单发货操作日志指南【指南】  C++中的std::shared_from_this有什么用?C++安全获取this的shared_ptr【智能指针】  Django密码修改后会话失效的解决方案  php打包exe后无法写入文件_权限问题解决方法【教程】  MySQL 中使用 IF 和 CASE 实现查询字段的条件转换  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  Python实现图数据库操作_Neo4j核心CRUD与图算法解析  php下载安装后memory_limit怎么设置_内存限制调整【技巧】  php增删改查报错1054怎么办_字段名错误排查修复【解答】  Win11用户账户控制怎么关_Win11关闭UAC弹窗提示【设置】  c++中的std::conjunction和std::disjunction是什么_c++模板元编程逻辑运算【C++17】 

 2026-01-05

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.