我想从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
在围棋场上试试吧。