2010-10-18 83 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