8

我有一堆要解析的 CSV 文件 - 问题是一半有引号用作引号,而逗号在主字段内。它们并不是真正的 CSV,但它们确实有固定数量的可识别字段。dialect=csv."excel" 设置非常适用于字段内没有额外 " 和 , 字符的文件。

该数据是旧的/不受支持的。我正试图给它注入一些生命。

例如

"AAAAA
AAAA
AAAA
AAAA","AAAAAAAA


AAAAAA
AAAAA "AAAAAA" AAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAA, AAAAA
AAAAAAAAA AAAAA AAAAAAAAAA
AAAAA, "AAAAA", AAAAAAAAA
AAAAAAAA AAAAAAAA
AAAAAAA
"

这会使文件解析器跳闸,并引发错误_csv.Error: newline inside string。我通过从第二个字段内部删除引号将问题缩小到这个问题,并且 csv.reader 模块可以解析文件。

有些字段是多行的 - 我不确定这是否重要。

我一直在寻找方言设置,虽然我可以找到“skipinialspace”,但这似乎并不能解决问题。

需要明确的是 - 这不是有效的 'CSV',它的数据对象松散地遵循 CSV 结构,但在现场测试中有 , 和 " 字符。

换行符是 \x0d\x0a

我已经在方言模块中的双引号和引用变量的不同排列中尝试了很多次,但我无法正确地得到这个解析。

我不能确信“或”组合仅存在于字段边界上。

这个问题只存在于文件中的几个字段中的一个(最后一个),并且有几千个文件。

4

3 回答 3

11

您是否尝试过csv.QUOTE_NONE通过quoting关键字 arg 传递?如果没有一些代码或数据来测试它,我无法知道这是否真的适用于您的数据,但它似乎适用于您提供的片段。

>>> import csv
>>> r = csv.reader(open('foo.csv', 'rb'), quoting=csv.QUOTE_NONE)
>>> for row in r: print row
... 
['"A"', '"B"', '"ccc "ccccccc" cccccc"']
于 2012-02-10T23:08:53.607 回答
4

我还不允许发表评论,所以我会发布作为答案......

假设您使用逗号作为分隔符,您的数据中是否有逗号?如果不是,那么您可以在 CSV 处理之前进行大量查找和替换,以将字段的第一个字符之后和最后一个字符之前的所有引号字符加倍。

于 2012-02-10T23:29:36.387 回答
2

我会编写一个转换器来解析初始 csv 并输出一个有效的。您可以使用 ", 或 "\n 作为确定分隔符的机制。

于 2012-02-11T00:14:30.190 回答