我正在使用Go:
阅读MaxMind GeoIP Lite城市位置CSV文件csvFile, err := os.Open("/path/GeoLiteCity_20130702/GeoLiteCity-Location.csv")
defer csvFile.Close()
if err != nil {
panic(err)
}
csvf := csv.NewReader(csvFile)
csvf.Read() // skip header row
for {
fields, err := csvf.Read()
if err == io.EOF {
break
} else if err != nil {
panic(err)
}
// does nothing yet
}
我得到的错误是:
恐慌:第2行第22列:行尾的额外分隔符
goroutine 1 [running]:main.main() /path/myprogram.go:239 + 0x108f
goroutine 2 [runnable]:退出状态2
文件很长,但从这些行开始:
locId,country,region,city,postalCode,latitude,longitude,metroCode,areaCode
1,O1,,,,0.0000,0.0000,,
2,AP,,,,35.0000,105.0000,,
3,EU,,,,47.0000,8.0000,,
4,AD,,,,42.5000,1.5000,,
5,AE,,,,24.0000,54.0000,,
6,AF,,,,33.0000,65.0000,,
7,AG,,,,17.0500,-61.8000,,
8,AI,,,,18.2500,-63.1667,,
9,AL,,,,41.0000,20.0000,,
它似乎格式正确。每行有9个字段。
第239行是我调用恐慌的行panic(err)
。正如您所看到的,它在CSV文件的第2行失败,这发生在循环的第一次迭代中(第1行在循环之前读取,跳过标题行)。第2行的第22列是倒数第二个逗号。
我在这里遗漏了什么吗?我没有看到任何尾随的逗号...(澄清:每行末尾的逗号必须在那里表示空字段值,因此它们不会跟踪,例如,额外的。)
更新: The gophers have resolved this issue and the fix ships with Go 1.1.2。
答案 0 :(得分:5)
每一行都有两个尾随逗号。
尝试设置csv.Reader.TrailingComma = true
。
通常有助于查看源代码或至少包文档: - )
答案 1 :(得分:1)
这是complete example for you。关键是csvf.TrailingComma = true
。
package main
import (
"bytes"
"encoding/csv"
"fmt"
"io"
)
var csvData = `locId,country,region,city,postalCode,latitude,longitude,metroCode,areaCode
1,O1,,,,0.0000,0.0000,,
2,AP,,,,35.0000,105.0000,,
3,EU,,,,47.0000,8.0000,,
4,AD,,,,42.5000,1.5000,,
5,AE,,,,24.0000,54.0000,,
6,AF,,,,33.0000,65.0000,,
7,AG,,,,17.0500,-61.8000,,
8,AI,,,,18.2500,-63.1667,,
9,AL,,,,41.0000,20.0000,,
`
func main() {
csvFile := bytes.NewBufferString(csvData)
csvf := csv.NewReader(csvFile)
csvf.TrailingComma = true
csvf.Read() // skip header row
for {
fields, err := csvf.Read()
if err == io.EOF {
break
} else if err != nil {
panic(err)
}
// does nothing yet
fmt.Println(fields)
}
}