【问题标题】:Parse Space Delimited Files With Spaces In Fields [duplicate]用字段中的空格解析空格分隔文件[重复]
【发布时间】:2020-01-29 17:34:10
【问题描述】:

我有一个使用空格作为分隔符的 CSV 文件。但是有些字段包含一个空格,并且这些字段用双引号括起来。任何具有空值/空值的字段都表示为“-”。非 null/空且不包含空格的字段不包含在双引号中。这是 CSV 文件中一行的示例。

foobar "foo bar" "-" "-" "-" fizzbuzz "fizz buzz" fizz buzz

CSV 文件也没有标题。我打算使用一个简单的解决方案,例如https://stackoverflow.com/a/20769342/3299397,但使用strings.Split(csvInput, " ") 不会处理字段内的空格。我也查看了这个库https://github.com/gocarina/gocsv,但我很好奇是否有不使用第三方库的解决方案。

【问题讨论】:

    标签: csv go delimiter


    【解决方案1】:

    这是“普通”CSV 格式,其中分隔符是空格字符,而不是逗号或分号。 encoding/csv 包可以处理这个问题。

    至于您的空/空字段:只需使用循环作为后处理步骤并将它们替换为空字符串。

    使用输入:

    const input = `foobar "foo bar" "-" "-" "-" fizzbuzz "fizz buzz" fizz buzz
    f2 "fo ba" "-" "-" "-" fd "f b" f b`
    

    解析和后处理:

    r := csv.NewReader(strings.NewReader(input))
    r.Comma = ' '
    records, err := r.ReadAll()
    if err != nil {
        panic(err)
    }
    fmt.Printf("%#v\n", records)
    
    for _, r := range records {
        for i, v := range r {
            if v == "-" {
                r[i] = ""
            }
        }
    }
    fmt.Printf("%#v\n", records)
    

    输出(在Go Playground上试试):

    [][]string{[]string{"foobar", "foo bar", "-", "-", "-", "fizzbuzz", "fizz buzz", "fizz", "buzz"}, []string{"f2", "fo ba", "-", "-", "-", "fd", "f b", "f", "b"}}
    [][]string{[]string{"foobar", "foo bar", "", "", "", "fizzbuzz", "fizz buzz", "fizz", "buzz"}, []string{"f2", "fo ba", "", "", "", "fd", "f b", "f", "b"}}
    

    【讨论】:

    • @KyleBridenstine encoding/csv 包声明它实现了RFC4180 中描述的 CSV 格式,它允许可选的引用字段。 encoding/csv 的包文档中也明确提到了这一点:“以引号字符开始和停止的字段”称为quoted-fields。开头和结尾的引号不是该字段的一部分。"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    相关资源
    最近更新 更多