请在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可能改变的唯一不同之处是给我提供更多关于字符流中检测到不完整模式的参数。抱歉,也许我在阅读堆栈跟踪时错过了这一点。
我打算至少就在解析的文件中遇到错误的位置提出报告。查看Java API层次结构中的Reader、FilterReader和PushbackReader,我认为这绝非易事。然而,这确实应该是data.csv的范围,告诉读取器不完整性在哪里——至少是文件名、行号和列。 意外的字符在哪里?

这将节省我很多时间去寻找一个工具,仅为此目的,到那时,我看到了错误是在引号字符串中的未转义引号,并不得不找到其他工具来修复它。这种问题在我目前正在处理的数据集中非常普遍,这可以算是我希望data.csv做掉的唯一事情,或者至少可以诊断。
我记录了https://clojure.atlassian.net/browse/DCSV-22来跟踪这个问题。
0
作者

您可以通过指定不同的:quote 字符来指定 fields 不加引号的文件解析方式。这样,实际引号就成为 read-csv 从字段中收集的字符串的一部分。我认为这种方法在处理制表符分隔的文件中比逗号分隔的文件更有用。一些奇怪的逗号分隔文件的制作者可以生成制表符分隔的文件,从形式上来看同样奇怪,但幸运的是缺少包含实际制表的原始值,因此对于各种下游处理来说效果更好。

...