我正在阅读如何在Golang中使用CSV并遇到此代码:
csvFile, _ := os.Open("people.csv")
reader := csv.NewReader(bufio.NewReader(csvFile))
var people []Person
for {
line, error := reader.Read()
if error == io.EOF {
break
} else if error != nil {
log.Fatal(error)
}
people = append(people, Person{
Firstname: line[0],
Lastname: line[1],
})
}
位于:https://www.thepolyglotdeveloper.com/2017/03/parse-csv-data-go-programming-language/
我觉得这里令人困惑的是无限的for循环,每次迭代抓住下一行但是没有lineNum++
类型的逻辑被传递到Reader中。读者如何知道它的哪个迭代?我怎么能改变这个?例如。抓住只是第一行。
答案 0 :(得分:8)
Golang中的Reader如何自动迭代循环? 读者如何知道它在哪个迭代?
Read方法通过从底层io.Reader中消耗更多数据来返回下一条记录。当基础读取器中没有更多记录时,Read方法返回io.EOF。
应用程序负责在循环中调用read,如示例所示。
Reader不需要知道读取下一条记录的行号,但Reader确实在其内部状态中保留line counter以注释错误。
如果应用程序需要知道行号,应用程序可以声明一个计数器并在每次读取时递增计数器。
我该怎么改变?例如。抓住第一行。
调用一次读取:
f, err := os.Open("people.csv")
if err != nil {
// handle error
}
defer f.Close()
r := csv.NewReader(f)
firstLine, err := r.Read()
if err != nil {
// handle error
}