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

更新日期: 2020-06-22 阅读次数: 347 字数: 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

爱评论不评论

近期节日

2020年08月15日 日本投降日
2020年08月22日 处暑
2020年08月25日 七夕
2020年09月02日 中元节
2020年09月03日 抗日胜利纪念日
2020年09月07日 白露
2020年09月08日 国际扫盲日
2020年09月10日 教师节
2020年09月16日 国际臭氧层保护日
2020年09月16日 世界清洁地球日
2020年09月18日 "九一八"事变纪念日
2020年09月20日 国际爱牙日
查看更多节日