golang 解析 csv 文件报错 parse error: extraneous or missing " in quoted-field

更新日期: 2020-06-22 阅读次数: 6221 字数: 365 分类: golang

解析百度统计 CSV 日志的系统运行了快一个月,没有出现问题。但是今天早上突然报错退出:

> import_log /mnt/d/to_del/2020-06-20.csv
2020/06/22 07:55:18 parse error on line 686, column 60: extraneous or missing " in quoted-field

对应的 CSV 文件数据行为类似这样的结构,报错点在“烟台”前的一个双引号上。

"515","2020/06/20 13:07:08","烟台 "golang" (www)", "Windows 10"

可见,百度 CSV 文件没有对双引号进行转义。

哪里报错的呢

怎么知道具体是哪行 golang 代码报错的呢?

log.Fatal 是否会导致程序退出

我实际测试 log.Println 并不会导致程序退出,而 log.Fatal 会。

查了一个文档,确实是这样:

log.Fatal is equivalent to Print() followed by a call to os.Exit(1).

那么,很自然的,就会猜测是 log.Fatal 那行导致程序退出。

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

	parseRecord(record)
}

忽略此行

for {
	// Read each record from csv
	record, err := r.Read()
	if err == io.EOF {
		break
	}

	if err != nil {
		log.Println(err)
		log.Println("Ignore")
	} else {
		parseRecord(record)
	}
}

除了忽略这行数据,还有什么其他方法

因为使用双引号,在搜索时是比较常用的做法,双引号代表必须包含这个关键词。

目前这种忽略的做法,非常不严谨。

// TODO

tags: golang csv

关于作者 🌱

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