go 解析 csv 文件报错

36 阅读1分钟

问题

最近在使用 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,则会以第一条记录的数量为标准,接下来每行都必须有对应的字段数,如果为负数,则不会检查字段数。

image.png

修改后的代码如下:

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

参考