golang 读取并解析 csv 文件

更新日期: 2020-06-15 阅读次数: 378 字数: 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 包头

继续阅读

爱评论不评论

近期节日

2020年07月06日 国际接吻日
2020年07月06日 小暑
2020年07月07日 抗日战争纪念日
2020年07月11日 世界人口日
2020年07月22日 大暑
2020年07月30日 非洲妇女日
2020年08月01日 八一建军节
2020年08月06日 国际电影节
2020年08月07日 立秋
2020年08月15日 日本投降日
2020年08月22日 处暑
2020年08月25日 七夕
查看更多节日