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,以解析字段 never 引用的文件。然后,实际的引号标记就成为了 read-csv 从字段收集的字符串的一部分。我想这种技术在处理表分隔的文件中比逗号分隔的文件更常用。有些奇怪的逗号分隔文件的制作者可以创建表分隔的文件,在形式上,同样奇怪,但幸运的是没有包含少量文本制表符的原始值,这使得它们在下游处理中效果更好。

...