如何在 Go 中使用 CSV 读取不同的字段行?

  • 本文关键字:字段 读取 CSV Go csv go
  • 更新时间 :
  • 英文 :


我想从csv文件中读取数据。但是该文件在文件的末尾有不同的字段。我也想提取那些行,当遇到ErrFieldCount时。我怎么能那样做。

package main
import (
"encoding/csv"
"fmt"
"io"
"log"
"strings"
"errors"
)
func main() {
in := `first_name,last_name,username
"Rob","Pike",rob
Ken,Thompson,ken
"Robert","Griesemer"
`
r := csv.NewReader(strings.NewReader(in))
for {
record, err := r.Read()
if err == io.EOF {
break
}

if err != nil {
if errors.Is(err, csv.ErrFieldCount) {
// fmt.Println("#", differentRow")
log.Fatal("wrong fields")
//TODO I want to pick it up here
}else{
log.Fatal(err)
}
}
fmt.Println(record)
}
}

我的预期输出:

[first_name last_name username]
[Rob Pike rob]
[Ken Thompson ken]
# "Robert","Griesemer".   <---- my expect line ...
2009/11/10 23:00:00 wrong fields

当返回csv.ErrFieldCount时,您仍然会在record变量中得到(解析的(行,所以只需打印即可。这记录在Reader.Read():中

如果记录有意外数量的字段,Read将返回该记录以及错误ErrFieldCount。

不要使用log.Fatal()打印消息,因为这会终止您的应用程序。

if err != nil {
if errors.Is(err, csv.ErrFieldCount) {
fmt.Println("#", record)
log.Println("wrong fields")
} else {
log.Fatal(err)
}
continue
}

有了这个改变,输出就是你想要的:

[first_name last_name username]
[Rob Pike rob]
[Ken Thompson ken]
# [Robert Griesemer]
2009/11/10 23:00:00 wrong fields

在围棋场上试试吧。

最新更新