33.Go操作CSV文件

工作中,使用到CSV文件的场景还是比较多的,比如:

  1. 脚本使用:有一份名单之类的数据,需要对其进行某种操作,如发现需要对某十个用户补发站内信,此时可能就需要提供一份CSV表格文件,每行就是需要补发的信息,如用户名,用户ID,站内信内容等。读取CSV文件后,进行站内信的下发。
  2. 文件下载:如在某个界面上,用户查看到的数据,想要下载下来,此时我们会将数据作为CSV文件存入文件存储系统,而后返回下载链接,让用户可以下载。

不管怎么样,我们需要知道最基本的CSV文件的写入与读取操作。

代码如下

package main

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

func CreateCsv() {
	//创建文件
	f, err := os.Create("test.csv")
	if err != nil {
		fmt.Println(err)
	}
	defer f.Close()
	// 写入UTF-8 BOM(byte order mark / 字节顺序标记)
	f.WriteString("\xEF\xBB\xBF")
	//创建一个新的写入文件流
	w := csv.NewWriter(f)
	//这个二维数组,外层几个元素就代表几行,内层几个元素就代表几列
	data := [][]string{
		{"序号", "姓名", "年龄"}, //三列
		{"1", "刘备", "23"},
		{"2", "张飞", "23"},
		{"3", "关羽", "23"},
		{"4", "赵云", "23"},
		{"5", "黄忠", "23"},
		{"6", "马超", "23"},
	} //6行
	//写入数据
	w.WriteAll(data)
	w.Flush()
}

func ReadCsv(filePath string) {
	byteContent, err := os.ReadFile(filePath)
	if err != nil {
		panic(err)
	}

	csvR := csv.NewReader(strings.NewReader(string(byteContent)))
	records, err := csvR.ReadAll()

	if err != nil {
		panic(err)
	}

	fmt.Println(len(records[0][0])) // "\xEF\xBB\xBF" 3字节  + 序号 6字节 = 9字节

	// 针对大文件,一行一行的读取文件
	for i, record := range records {
		if i == 0 {
			continue // 跳过表头
		}
		fmt.Println(record)
	}

}

func main() {
	CreateCsv()
	ReadCsv("test.csv")
}

运行后会在项目路径下产生test.csv文件
在这里插入图片描述
控制台打印输出的结果如下:
在这里插入图片描述

注意点:

  1. 创建文件后,我们首先使用了f.WriteString("\xEF\xBB\xBF")向文件中写入了三个字节,它是一个utf8BOM,也即 byte order mark / 字节顺序标记
  2. 因为BOM的存在,所以打印表头第一列时,是9个字节,"\xEF\xBB\xBF" 3字节 + 序号 6字节 = 9字节
  3. 写完后需要调用Flush方法保证最后的内容也写入到了文件中
  4. 读取时,一般表头我们是不需要的,所以过滤掉,然后就是读取二维string数组取出数据即可,每个元素都是字符串,可以根据需要使用strconv包的ParseXXX方法解析为期望的数据类型。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在导出 CSV 文件时,如果时间格式出现乱码,可能是因为 CSV 文件默认使用的字符编码与时间格式不匹配。为了解决这个问题,你可以进行以下操作: 1. 指定字符编码:在导出 CSV 文件时,可以指定字符编码为 UTF-8,这是一种常见的字符编码,支持大多数语言的字符。你可以在写入 CSV 文件之前设置文件头部的字符编码,示例如下: ```go import ( "encoding/csv" "os" ) func main() { file, err := os.Create("output.csv") if err != nil { panic(err) } defer file.Close() file.WriteString("\xEF\xBB\xBF") // 添加 UTF-8 BOM 头部 writer := csv.NewWriter(file) defer writer.Flush() // 写入 CSV 数据 writer.Write([]string{"Name", "Time"}) writer.Write([]string{"Alice", "2022-01-01 12:34:56"}) writer.Write([]string{"Bob", "2022-02-02 12:34:56"}) } ``` 在上面的示例中,我们使用 `file.WriteString("\xEF\xBB\xBF")` 添加 UTF-8 的 BOM(字节顺序标记)头部,以确保 CSV 文件以 UTF-8 编码打开时能正确显示。 2. 格式化时间字符串:如果你的时间格式在 CSV 文件中仍然显示乱码,你可以将时间进行格式化为字符串,然后写入 CSV 文件。示例如下: ```go import ( "encoding/csv" "os" "time" ) func main() { file, err := os.Create("output.csv") if err != nil { panic(err) } defer file.Close() writer := csv.NewWriter(file) defer writer.Flush() // 写入 CSV 数据 writer.Write([]string{"Name", "Time"}) t := time.Now() formattedTime := t.Format("2006-01-02 15:04:05") writer.Write([]string{"Alice", formattedTime}) // ... } ``` 在上面的示例中,我们使用 `time.Now()` 获取当前时间,然后使用 `Format` 函数将时间格式化为字符串,再写入 CSV 文件。 通过指定字符编码和格式化时间字符串,你可以解决导出 CSV 文件时时间格式乱码的问题。希望对你有所帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值