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

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

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

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

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

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

你可以使用负向前瞻

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

也许沿着这些方向……

使用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" ] 

然后删除| 言语之后。

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

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

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