我需要从FedEx.com处理包含送货历史的CSV文件。不幸的是,FedEx似乎并没有真正测试其CSV文件,因为它没有引用其中包含逗号的字符串。
例如,公司名称可能是“Dog Widgets,Inc。”但CSV不引用该字符串,因此任何CSV解析器都会在“Inc.”之前认为该逗号是一个新领域的开始。
有没有办法可以使用Ruby可靠地解析这些行?
我能找到的唯一区别特征是,作为字符串一部分的逗号在此之后会有一个空格。分隔字段的逗号没有空格。不知道如何帮助我解析这个,但这是我注意到的。
答案 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:]
无论你做什么,你都应该能够至少确定有问题的逗号的数量,并且应该给你一些东西(如果没有别的话,就会进行健全性检查)。