2024 Clojure调查问卷中分享您的观点!

欢迎!请查阅关于页面以了解更多关于此功能的信息。

0
data.csv

想象我们有以下CSV文件

A,B,C
this is,"a badly" quoted, file

尝试使用clojure.data.csv/read-csv解析此文件时,我得到以下异常

{:type java.lang.Exception
 :message "CSV error (unexpected character:  )"
 :at [clojure.data.csv$read_quoted_cell invokeStatic "csv.clj" 37]}

显然,此文件格式不正确,但我曾见过类似的文件,所以在read-csv中处理引号部分之后的多余内容将很有帮助

["this is" "a badly quoted" " file"]    

此建议的潜在问题

如果在引号内部有分隔符,这将更难解释。例如

this is,"a, badly" quoted, file

可能被解析为

["this is" "a, badly quoted " " file"]

或者

["this is" "\"a" " badly\" quoted " " file"]

虽然第二种解释在我看来不太可能,但我不知道在这种情况下“尽最大努力”的解析策略是什么

2 个答案

+1

被选中
 
最佳答案

我们并不计划支持格式不好的CSV数据。支持格式良好的CSV数据已经相当困难了。可能还有其他(Java)库可以处理或清理这种数据,但这超出了data.csv的范围。

至于这个问题:我遇到了使用从供应商网络应用程序导出的CSV文件的这个问题。起初对于Clojure无法处理CSV文件有些挫败,而Excel和Python似乎可以很好地加载它。但后来注意到,这些更加宽容的消费者似乎忽略了第一个未转义的引号。这可能会给我带来后续的问题。所以早期报错从长远来看节省了我很多时间。我已经向网络应用程序的供应商反馈了不规范的CSV问题。  我认为Clojure唯一可能做得不同的事情是提供更多关于字符流中不规范的模式被检测到的信息。抱歉,也许我在阅读调用堆栈时错过了这一点。
我同意至少报告错误发生在已解析文件的位置的请求。查看Reader、FilterReader和PushbackReader的Java API层次结构,我看到这是一项不易的任务。然而,这确实应该是data.csv的职责——告诉读取器不规范的模式在哪里——至少是文件名、行号和列。  意想不到的字符?在哪里?

这将为我节省大量寻找告诉我这一点工具的时间,这时我注意到错误是引号内的未转义引号,因此需要找到一个单独的工具来修复它。这个问题在我当前处理的数据集中非常常见,这应该是data.csv应该执行的一项操作,或者至少应该进行诊断。
我记录了https://clojure.atlassian.net/browse/DCSV-22来跟踪这个问题
0

您可以通过指定不同的 :quote 符号来读取-csv,以解析字段从不被引用的文件。然后任何实际的引号都成为 read-csv 从字段收集到字符串的一部分。我认为这种技术比逗号分隔的文件更常用于制表符分隔的文件。一些奇怪的逗号分隔文件的生产商可以生成制表符分隔的文件,从正式意义上说,同样奇怪,但幸运的是没有包含实际制表符的原始值,因此在所有类型的下游处理中表现更好。

...