golang 读取并解析 csv 文件

更新日期: 2020-06-15 阅读次数: 18336 字数: 289 分类: golang

从百度统计后台导出并下载了实时访客的 CSV 文件。想本地解析一下,并导入到 MySQL 中做备份,因为百度统计只能保留两个周的历史数据,且上限为5000条。

golang 解析 csv 代码

这里用到了 golang 内置的 "encoding/csv" 库,能自动读取一行 csv 数据,并返回 slice 类型的数据。

package main

import (
	"encoding/csv"
	"fmt"
	iconv "github.com/djimenez/iconv-go"
	"io"
	"log"
	"os"
)

func main() {
	// Open the file
	csvfile, err := os.Open("2020-05-21.csv")
	if err != nil {
		log.Fatalln("Couldn't open the csv file", err)
	}
	defer csvfile.Close()

	// Parse the file
	r := csv.NewReader(csvfile)

	// Iterate through the records
	for {
		// Read each record from csv
		record, err := r.Read()
		if err == io.EOF {
			break
		}
		if err != nil {
			log.Fatal(err)
		}

		fmt.Printf("Record has %d columns.\n", len(record))
		city, _ := iconv.ConvertString(record[2], "gb2312", "utf-8")

		fmt.Printf("%s %s %s \n", record[0], record[1], city)
	}
}

编码转换

百度统计导出的 CSV 非常奇葩,文件编码为 latin1, 导致里面的中文显示为乱码。

想都不用想,百度肯定还在用 gb2312,所以需要将包含中文的字段做编码转换。这里用到了这个库

github.com/djimenez/iconv-go

解析结果

以一行数据为例:

Record has 28 columns.
1027 2020/05/21 00:04:17 包头

继续阅读

tags: golang csv

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式