【发布时间】:2021-02-26 13:22:55
【问题描述】:
我正在尝试解析托管在远程位置的 CSV 文件,但令人讨厌的是,该文件在文件顶部包含一些自述文件 cmets,格式如下:
######
# some readme text,
# some more, comments
######
01-02-03,123,foo,http://example.com
04-05-06,789,baz,http://another.com
我正在尝试使用以下代码来提取数据中的 URL,但由于顶部的 cmets,它会引发错误提示 wrong number of fields,可能是它试图将它们解析为 CSV 内容。
type myData struct {
URL string `json:"url"`
}
func doWork() ([]myData, error) {
rurl := "https://example.com/some.csv"
out := make([]myData, 0)
resp, err := http.Get(rurl)
if err != nil {
return []myData{}, err
}
defer resp.Body.Close()
reader := csv.NewReader(resp.Body)
reader.Comma = ','
data, err := reader.ReadAll()
if err != nil {
return []myData{}, err
}
for _, row := range data {
out = append(out, myData{URL: row[4]})
}
return out, nil
}
func main() {
data, err := doWork()
if err != nil {
panic(err)
}
// do something with data
}
有没有办法跳过远程文件的前 N 行,或者让它忽略以 # 开头的行
【问题讨论】:
-
谢谢,您能否就如何实现过滤器提出建议?
-
以 # 开头的行是我见过的许多 csv 文件中的 cmets。我认为这是标准的一部分。
-
@WalterMitty:没有 csv“标准”,有信息 RFC4180 根本没有提到 cmets,这意味着由解析应用程序来确定是否允许 cmets,以及语法是。 (我忘了 go
csv.Reader提供了一种方便的配置过滤线的方法,@c0nt0s0 在下面找到)