Ruby:如何处理带有“坏逗号”的CSV文件?

时间:2010-10-18 20:26:31

标签: ruby parsing csv

我需要从FedEx.com处理包含送货历史的CSV文件。不幸的是,FedEx似乎并没有真正测试其CSV文件,因为它没有引用其中包含逗号的字符串。

例如,公司名称可能是“Dog Widgets,Inc。”但CSV不引用该字符串,因此任何CSV解析器都会在“Inc.”之前认为该逗号是一个新领域的开始。

有没有办法可以使用Ruby可靠地解析这些行?

我能找到的唯一区别特征是,作为字符串一部分的逗号在此之后会有一个空格。分隔字段的逗号没有空格。不知道如何帮助我解析这个,但这是我注意到的。

4 个答案:

答案 0 :(得分:9)

你可以使用负向前瞻

>> "foo,bar,baz,pop, blah,foobar".split(/,(?![ \t])/)
=> ["foo", "bar", "baz", "pop, blah", "foobar"]

答案 1 :(得分:1)

嗯,这里有一个想法:你可以用一个唯一的字符替换每个逗号后跟一个空格的实例,然后像往常一样解析CSV,然后遍历生成的行并反转替换。

答案 2 :(得分:1)

也许就是这些......

使用gsub将','更改为其他内容

ruby-1.9.2-p0 > "foo,bar,baz,pop, blah,foobar".gsub(/,\ /,'| ').split(',')
[
    [0] "foo",
    [1] "bar",
    [2] "baz",
    [3] "pop| blah",
    [4] "foobar"
]

然后删除|言语之后。

答案 3 :(得分:0)

如果你很幸运,只有一个这样的字段,你可以从开头解析前导字段,尾随字段而不是结束,并假设剩下的是有问题的字段。在python(没有habla ruby​​)中,这看起来像是:

fields = line.split(',') # doesn't work if some fields are quoted
fields = fields[:5] + [','.join(fields[5:-3])] + fields[-3:]

无论你做什么,你都应该能够至少确定有问题的逗号的数量,并且应该给你一些东西(如果没有别的话,就会进行健全性检查)。