2024 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅 关于 页面以了解更多关于此网站的工作方式的信息。

+1
data.csv

当在引号后存在空格时,Clojure 读取器会因为一个奇怪的错误而崩溃。
花了一些时间我才注意到现在是一个空格问题,因为空格...是不可见的。

下面是一个错误的示例。

=> (read-csv (java.io.StringReader. "\"a\" " ))
异常 CSV 错误 (意外字符: ) clojure.data.csv/read-quoted-cell (csv.clj:36)
=> (read-csv (java.io.StringReader. "\"a\"" ))
((链接: "a"))

3 个答案

+1

评论由:pschulz01 制作

这与 DSCV-8 有关

如果字符串开头的引号和中间的引号(例如,在第二个引号后有额外的字符)结束时,将导致相同的问题。

0

评论由: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 文件时,很容易引入这样的问题/错误,随后就相当难以正确分析这个问题。
因此,我建议采用一种操作模式,其中在开引号前的空白或闭引号后的空白被视为无效(除非它是像 "" 这样的转义引号)。

0
参考:[a href="https://clojure.atlassian.net/browse/DCSV-6" rel="nofollow" target="_blank">https://clojure.atlassian.net/browse/DCSV-6
...