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的范围。

顺便提一下:我在处理一个供应商的Web应用程序导出的CSV文件时遇到了这个问题。一开始有点沮丧,Clojure无法处理CSV文件,而Excel和Python则可以正常加载。但我注意到了,这些宽容的消费者似乎会省略第一个未转义的引号。这可能会引起我的后续问题。所以,及早错误可以说是节省了我长期的时间。我已经将不规则的CSV问题报告给了Web应用程序的供应商。唯一我认为Clojure可以有所不同的地方是,给我更多的信息,说明哪里在字符流中检测到不规则的模式。对不起,也许我在阅读堆栈跟踪时错过了这一点。
我将继续支持报告错误至少发生在解析文件中的哪个位置。查看Java API的Reader、FilterReader和PushbackReader层次结构,我发现这是一项艰巨的任务。尽管如此,这确实是data.csv的职责,告诉读者哪里有不规则的模式——至少是文件名、行号和列。意外字符在哪里?

这将为我节省很多寻找告诉我的工具的时间,此时我发现错误是引号字符串中的未转义引号,并不得不寻找其他工具来解决它。我目前处理的数据集中有许多这样的问题,这使它成为我希望data.csv能够清理或至少诊断的唯一问题。
我记录了https://clojure.atlassian.net/browse/DCSV-22以跟踪此问题
0

通过指定不同的:quote字符给read-csv,您可以将字段 never 引述的文件进行解析。然后read-csv从字段中收集的实际引号成为字串的一部分。我认为这种技术在制表符分隔的文件中比逗号分隔的文件中更有用。一些奇怪的逗号分隔文件的制作者可以产生制表符分隔的文件,在正式意义上,同样奇怪但却幸运地缺少包含实际制表符的原始值,因此它们对于各种后端处理来说更好。

...