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

有趣的是,空白被认为是从字符串开始的地方,接下来的引号被认为是文本值的一部分。
使用引号的主要原因是在文本中允许分隔符,所以让我们看看如果我们通过在字符串中添加分隔符会发生什么。
=>(使用java.io.StringReader读取CSV. "\"a\", 5\n \"b,b\",\"6\"”)
(链接: "a" " 5") (链接: " \"b" "b\"" "6")

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

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

0
参考:[https://clojure.atlassian.net/browse/DCSV-6](https://clojure.atlassian.net/browse/DCSV-6)(由 cvkemenade 提交)
...