评论者: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中进行小的手动修改时,很容易引入这种问题/错误,并且正确分析这种问题相当困难。
因此,我倾向于采用一种操作模式,其中开引号之前或闭引号之后的空白被认为是无效的(除非它是一个转义引号,如"")。