2010-10-18 96 views
1

我需要处理含有航运历史FedEx.com CSV文件。不幸的是,联邦快递似乎并没有真正测试它的CSV文件,因为它不会引用其中包含逗号的字符串。红宝石:我如何处理与“坏逗号” CSV文件?

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

有没有什么办法可以可靠地解析使用Ruby的行?

我能找到的唯一区别特征是,是一个字符串的一部分的逗号有再经过空间。分隔字段的逗号没有空格。不知道如何帮助我解析这个,但这是我注意到的。

回答

1

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

0

也许东西沿着这些路线..使用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" 
] 

然后取出|之后。

0

如果你是幸运的,只有这样的一个领域,你可以解析领导场关闭开始,比结束后关闭场,并承担一切剩下的是有问题的领域。在蟒蛇(无哈布拉红宝石),这将是这个样子:

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

不管你做什么,你应该能够至少确定违规逗号的数量,应该给你的东西(一个全面的检查,如果没有别的)。

9

你可以使用负前瞻

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

+1在拆分正则表达式使用分组。 – 2010-10-19 07:43:35

+0

呀,辉煌的答案 – 2013-01-29 23:45:03