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唯一可以做得不同的地方可能是给我更多关于字符流中检测到格式错误模式位置的信息。对不起,也许我在阅读堆栈跟踪时遗漏了这一点。
作者:
我将在要求至少报告错误位置的问题上加1。查看Java API的Reader、FilterReader和PushbackReader层次结构,我发现这并不是一件容易的事情。尽管如此,这真的应该是data.csv的职责——告知读取器格式错误的位置——至少是文件名、行号和列。意外字符在哪里?

这将节省我很多时间去找一个工具告诉我这些信息,此时我看到错误发生在字符串中的未转义引号,然后不得不找到另一个工具来修复它。在我目前处理的数据集中,这个问题非常普遍,这可以证明是我希望data.csv应该清理或至少诊断的那一件事。
作者:
我已记录https://clojure.atlassian.net/browse/DCSV-22来跟踪这个问题
0
作者:

您可以通过为 read-csv 指定不同的引号字符来解析一个字段从不会被引号的文件。然后,实际的引号将变为 read-csv 从字段收集的字符串的一部分。我想这种技术在处理制表符分隔的文件中比逗号分隔的文件中更常用。一些奇怪的逗号分隔文件的生产者可以生产出制表符分隔的文件,形式上非常奇怪,但幸运地缺少包含实际制表符的原始值,因此在各种下游处理中表现更佳。

...