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



我有一个使用空格作为分隔符的CSV文件。但是有些字段包含一个空格,并且这些字段用双引号括起来。任何具有空/空值的字段都表示为"-"。非空/空且不包含空格的字段不会用双引号括起来。下面是 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格式,其中分隔符是空格字符,而不是逗号或分号。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("%#vn", records)
for _, r := range records {
for i, v := range r {
if v == "-" {
r[i] = ""
}
}
}
fmt.Printf("%#vn", 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"}}

最新更新