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

文章目录

    解析百度统计 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

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式