利用golang生成.csv文件(需加BOM表头,避免excel打开.csv文件中文乱码)

发布时间:2024-10-22 14:01

注意:
生成.csv文件时,需写入UTF-8 BOM表头,避免使用excel软件打开.csv文件出现中文乱码

writer.WriteString(\"\\xEF\\xBB\\xBF\")
package main

import (
	\"bufio\"
	\"fmt\"
	\"io/ioutil\"
	\"os\"
	\"strings\"
)

// GenerateCsvFile 通过网络下载原.csv文件,将经过筛选后的行记录(比如去除包含\"黑名单\"字样的记录),导出到一个新的.csv文件
func GenerateCsvFile(url string) {
    fmt.Println(\"开始导出...\")

	// csv下载文件示例链接:http://xxx.com/downloads/test.csv
	// 下载的csv如果用 ioutil.ReadAll() 读出并转为字符串后,打开后每行单元格间默认是按英文逗号分隔开的txt文本
	resp, err := http.Get(url)
	if err != nil {
		fmt.Println(\"http.Get err: \", err)
		return
	}
	defer resp.Body.Close()

	// 读取下载好的csv文件数据流
	byteData, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println(\"ioutil.ReadAll err: \", err)
		return
	}

	// 将csv文件按行分割
	rowDataArr := strings.Split(string(byteData), \"\\n\")
	if len(rowDataArr) <= 1 {
		fmt.Println(\"仅有表头数据不导出,跳过...\")
		return
	}

	// 默认创建.csv格式的文件,体积小,可以直接用excel打开(需要加BOM表头)
	file, err := os.OpenFile(\"./test.csv\", os.O_CREATE|os.O_RDWR, 0666)
	if err != nil {
		fmt.Println(\"os.OpenFile err: \", err)
		return
	}
	defer file.Close()

	// 写入UTF-8 BOM头,避免使用excel软件打开.csv文件出现中文乱码
	writer := bufio.NewWriter(file)
	writer.WriteString(\"\\xEF\\xBB\\xBF\")

	// 遍历文件并循环写入(不适用于大文件,一次性读取操作很占用内存)
	for i := 0; i < len(rowDataArr); i++ {
		if strings.Contains(rowDataArr[i], \"\") { // 示例:去除包含\"黑名单\"字样的记录
			continue
		}
		writer.WriteString(rowDataArr[i] + \"\\n\")
		writer.Flush()
	}

    fmt.Println(\"导出成功...\")
}

func main() {
	GenerateCsvFile(\"http://xxx.com/downloads/xxx.csv\") // url示例:xxx.csv
	return
}

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号