保存csv中文乱码_Golang导出CSV数据并解决数据乱码问题

在大数据量导出时,CSV格式成为优选,避免了内存占用和导出速度问题。本文讨论CSV格式的特点,尤其是中文乱码问题,并详细介绍了如何使用Golang实现CSV数据写入文件及在Web环境中导出CSV,确保中文不乱码。
摘要由CSDN通过智能技术生成

bc79d3bdc30cfc0dd3569d6388359d9a.png

作者:小谷xg 来源:SegmentFault 思否社区

在日常开发中,针对数据导出,我们可以导出Excel格式,但是如果是针对大数据量的导出,直接导出为Excel格式可能需要占用大量内存,且导出速度很慢。这个时候我们就需要导出为CSV格式。


CSV 格式

CSV本质上是文本文件,该文件有以下要求:

  • 列之间用逗号分隔,行之间用换行分隔

  • 单元格如果有逗号、引号之类的字符,该单元格需要使用双引号括起来

  • 如果内容包含中文,直接输出可能会乱码


实现方式

golang 官方有csv的库,可以很容易的实现csv数据的写入。

golang实现csv数据写文件
func main() {
    f, err := os.Create("data.csv")
    if err != nil {
        panic(err)
    }
    defer f.Close()

    f.WriteString("xEFxBBxBF") // 写入UTF-8 BOM,避免使用Microsoft Excel打开乱码 
    writer := csv.NewWriter(f)
    writer.Write([]string{"编号", "姓名", "年龄"})
    writer.Write([]string{"1", "张三", "23"})
    writer.Write([]string{"2", "李四", "24"})
    writer.Write([]string{"3", "王五", "25"})
    writer.Write([]string{"4", "赵六", "26"})
    writer.Flush() // 此时才会将缓冲区数据写入 }
golang实现web导出csv数据

此处以gin框架为例,如果用的go官方web库,其实差不多是一样的:

func ExportCsv(c *gin.Context) {
    bytesBuffer := &bytes.Buffer{}
    bytesBuffer.WriteString("xEFxBBxBF") // 写入UTF-8 BOM,避免使用Microsoft Excel打开乱码 
    writer := csv.NewWriter(bytesBuffer)
    writer.Write([]string{"编号", "姓名", "年龄"})
    writer.Write([]string{"1", "张三", "23"})
    writer.Write([]string{"2", "李四", "24"})
    writer.Write([]string{"3", "王五", "25"})
    writer.Write([]string{"4", "赵六", "26"})

    writer.Flush() // 此时才会将缓冲区数据写入 
    // 设置下载的文件名     c.Writer.Header().Set("Content-Disposition", "attachment;filename=data.csv")
    // 设置文件类型以及输出数据     c.Data(http.StatusOK, "text/csv", bytesBuffer.Bytes())
    return
}
- END -

c540098a9f4d273885c3967f350e2d55.png

389a2c176466e6c7b5f93e2090d28ab5.gif

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值