3

我正在使用 Go 阅读MaxMind GeoIP Lite City 位置 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 [运行]: 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 列是倒数第二个逗号。

我在这里错过了什么吗?我没有看到任何尾随逗号...(澄清:每行末尾的逗号必须存在以指示空字段值,因此它们不是尾随,如额外。)

更新: 地鼠已经解决了这个问题,并且该修复程序随 Go 1.1.2 一起提供

4

2 回答 2

5

每行甚至还有两个尾随逗号。

尝试设置csv.Reader.TrailingComma = true

它通常有助于查看源代码或至少是包文档:-)

于 2013-07-15T22:24:11.190 回答
1

这是一个完整的例子。关键是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)
    }
}
于 2013-07-15T22:34:58.490 回答