登录
首页 >  Golang >  Go问答

Go:CSV NewReader 未获取正确的字段数

来源:stackoverflow

时间:2024-02-28 08:03:26 167浏览 收藏

本篇文章给大家分享《Go:CSV NewReader 未获取正确的字段数》,覆盖了Golang的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。

问题内容

使用 newreader 时如何获取正确的字段数?

package main

import (
    "encoding/csv"
    "fmt"
    "log"
    "strings"
)

func main() {
    parser := csv.newreader(strings.newreader(`||""foo""||`))
    parser.comma = '|'
    parser.lazyquotes = true
    record, err := parser.read()
    if err != nil {
        log.fatal(err)
    }
    fmt.printf("record length: %v\n", len(record))
}

https://go.dev/play/p/gg-kyrciwfh

它应该返回 5,但我得到的是 3

record length: 3

Program exited.

编辑

我实际上正在处理一个包含许多双引号的大型 csv 文件。


正确答案


检查完你的代码后,我决定稍微修改一下,然后打印结果:

package main

import (
    "encoding/csv"
    "fmt"
    "log"
    "strings"
)

func main() {
    parser := csv.NewReader(strings.NewReader(`x||""FOO""|x|x\n`))
    parser.Comma = '|'
    parser.LazyQuotes = true
    record, err := parser.Read()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("record length: %v, Data: %v\n", len(record), strings.Join(record, ", "))
}

当您运行此命令时,数据将打印为 x, , "foo"||x|x\n"。我的想法是,当您以两个双引号结束条目时,解析器会假设该字符串仍在被引用,因此将该行的其余部分集中到第三个条目中。这似乎是 csv 包中惰性引用工作方式的一个错误,但是,在检查 documentation 中的 lazyquotes 时,您将看到以下内容:

这没有提到有关在双引号内查找双引号的任何内容。要解决此问题,您应该完全删除引号或将双引号 ("") 替换为双引号 (")。

您可能会考虑的另一件事是使用 gocsv 包。我过去曾使用过这个软件包,它相当稳定。我不确定它会如何回应这个特定问题,但可能值得您花时间检查一下。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>