问题
最近在使用 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时遇到字段数不匹配的问题,并分析了问题的原因,并给出了相应的解决方法。