问题

最近在使用 go 解析 csv 文件时,读取并打印 csv 的每行内容时,读取到第11行时,程序报错,提示:

record on line 11: wrong number of fields

分析

遇到这个问题,我第一反应是 csv 文件的格式有问题,于是我使用 cat 命令查看 csv 文件,发现 csv 文件的格式是正确的,没有问题。 并查看分隔符是正确的,于是可以得出 csv 文件是没有问题的。

接下来就查看所使用的标准库 encoding/csv, 通过查阅文档及 issue, 发现 csv 包中的 FieldsPerRecord 字段,FieldsPerRecord表示csv 文件每行的预期字段数, 如果为正数,则读取的每条记录都必须有对应的字段数,如果为0,则会以第一条记录的数量为标准,接下来每行都必须有对应的字段数,如果为负数,则不会检查字段数。

修改后的代码如下:

package main

import (
	"encoding/csv"
	"fmt"
	"io"
	"log"
	"os"
)

func main() {
	file, err := os.Open("./xx.csv")
	if err != nil {
		log.Fatal(err)
	}
	defer file.Close()
	// 创建一个 CSV reader
	reader := csv.NewReader(file)
	reader.FieldsPerRecord = -1
	// 循环读取 CSV 文件中的每一行数据
	for {
		record, err := reader.Read()
		if err == io.EOF {
			break
		}
		if err != nil {
			log.Fatal(err)
		}

		// 处理每一行数据
		fmt.Println(record)
		fmt.Println(len(record))
	}
}

小结

本文记录了在使用 go 解析csv时遇到字段数不匹配的问题,并分析了问题的原因,并给出了相应的解决方法。

参考