Csv 解析字段中带有空格的以空格分隔的文件

Csv 解析字段中带有空格的以空格分隔的文件,csv,go,delimiter,Csv,Go,Delimiter,我有一个使用空格作为分隔符的CSV文件。但有些字段包含空格,这些字段用双引号括起来。任何具有null/空值的字段都表示为-。不为null/空且不包含空格的字段不会用双引号括起来。下面是CSV文件中一行的示例 foobar "foo bar" "-" "-" "-" fizzbuzz "fizz buzz" fizz buzz 此外,CSV文件没有标题。我打算使用一个简单的解决方案,比如这个,但是使用strings.SplitcsvInput,无法处理字段中的空格。我也研究过这个库,但我很好奇是

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

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

此外,CSV文件没有标题。我打算使用一个简单的解决方案,比如这个,但是使用strings.SplitcsvInput,无法处理字段中的空格。我也研究过这个库,但我很好奇是否有一个解决方案不使用第三方库。

这是纯CSV格式,分隔符是空格字符,而不是逗号或分号。软件包可以处理这个问题

至于null/empty字段:只需使用循环作为后处理步骤,并用空字符串替换它们

使用输入:

const input = `foobar "foo bar" "-" "-" "-" fizzbuzz "fizz buzz" fizz buzz
f2 "fo ba" "-" "-" "-" fd "f b" f b`
解析和后处理it:

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)
请在以下服务器上尝试输出:

@KyleBridenstine编码/csv包声明它实现了中描述的csv格式,该格式允许可选的带引号的字段。编码/csv的文件包中也明确提到了这一点:以引号字符开头和结尾的字段称为引号字段。起始引号和结束引号不是字段的一部分。
[][]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"}}