请在 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"))

有趣的是,空白字符被视为字符串的开始,而跟在后面的引号被视为读取的文本值的一部分。
使用引号的主要原因是为了允许在文本中使用分隔符,让我们看看如果在字符串中添加一个分隔符会发生什么。
=> (read-csv (java.io.StringReader. "\"a\", 5\n \"b,b\",\"6\"" ))
((link: "a" " 5") (link: " \"b" "b\"" "6"))

现在我们可以看到分隔符不再被引号包围,正如预期的那样,该行被解释为包含三个值而不是两个值。

当使用标准库时,上述问题通常不会出现。然而,在自定义代码中生成csv文件或手动在csv中进行小型修复时,很容易引入此类问题或错误,并且随后很难正确分析该问题。
因此,我倾向于以操作模式,其中在开引号之前或闭引号之后的空白被认为是无效的(除非它是一个转义引号,如"")。

0 投票
by
参考:https://clojure.atlassian.net/browse/DCSV-6 (由cvkemenade报告)
...