golang使用CSV导出大量数据
2018年2月28日 · 86 字 · 1 分钟
最近在做一个导出功能,最初是使用https://github.com/tealeg/xlsx做的,但是发现导出有个30W行的excel时,这玩意内存彪到700M+,后来发现只是导出数据为表格,并没有其他东西,于是打算使用CSV导出。
CSV格式简介
CSV本质上是个文本文件,该文件有以下要求:
- 列之间用逗号分隔,行之间用换行分隔
- 单元格如果有逗号,引号之类的字符,该单元格需要使用双引号括起来
- 如果包含中文,需要使用GBK编码,否则会乱码
golang实现
UTF8转GBK函数(需要
go get golang.org/x/text/
)func UTF82GBK(src string) (string, error) { reader := transform.NewReader(strings.NewReader(src), simplifiedchinese.GBK.NewEncoder()) if buf, err := ioutil.ReadAll(reader); err != nil { return "", err } else { return string(buf), nil } }
导出代码
filename := "test.csv" fp, err := os.Create(filename) // 创建文件句柄 if err != nil { return nil, err } defer fp.Close() columns := []string{"姓名", "电话", "公司", "职位", "加入时间"} if line, err := util.UTF82GBK(strings.Join(columns, ",")); err == nil { // 写入一行 fp.WriteString(line + "\n") }
其他语言也可以使用类似方法导出数据,只要满足CSV的几个条件即可。