评论由:cvkemenade 制作
进一步来说,如果在行的末尾引号和分隔符之间存在空格(见下文),也会出现同样的问题:
=> (read-csv (java.io.StringReader. "\"a\" , 5\n \"b,b\",\"6\"" ))
异常 CSV 错误 (意外字符: ) clojure.data.csv/read-quoted-cell (csv.clj:36)
如果你在分隔符和开头引号之间放置空格(首先是最常见的默认情况),会发生什么问题
=> (read-csv (java.io.StringReader. "\"a\", 5\n\"b\",\"6\"" ))
((链接: "a" " 5") (链接: "b" "6"))
现在添加一个额外的空格
=> (read-csv (java.io.StringReader. "\"a\", 5\n \"b\",\"6\"" ))
((链接: "a" " 5") (链接: " \"b\"" "6"))
有趣的是,空白被认为是字符串的开始,紧跟其后的引号被认为是读取的 tekst-value 的一部分。
使用引号的主要原因是为了允许文本中的分隔符,让我们看看在我们将分隔符添加到字符串中会发生什么。
=>(读取-csv(java.io.StringReader. "\"a\", 5\n \"b,b\",\"6\""))
((链接: "a" " 5") (链接: " \"b" "b\"" "6"))
现在我们可以看到分隔符不再被引号包围,并且正如预期的那样,该行被解释为包含三个值而不是两个值。
当使用标准库时,上述问题通常不会出现。然而,在生成 csv 文件的自定义代码中,或者在手动修复 csv 文件时,很容易引入这样的问题/错误,随后就相当难以正确分析这个问题。
因此,我建议采用一种操作模式,其中在开引号前的空白或闭引号后的空白被视为无效(除非它是像 "" 这样的转义引号)。