2010-10-18 3 views
1

Мне нужно обработать CSV-файл из FedEx.com, содержащий историю доставки. К сожалению, FedEx, похоже, не тестирует свои CSV-файлы, так как не цитирует строки, в которых есть запятые.Ruby: Как я могу обработать файл CSV с «плохими запятыми»?

Например, название компании может быть «Dog Widgets, Inc.» но 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

Если вам так повезло, что у вас есть только одно поле, вы можете проанализировать начальные поля с начала, завершающие поля, а не конечные, и предположить, что все остальное - это оскорбительное поле. В питоне (не Habla рубина) это будет выглядеть что-то вроде:

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

Что бы вы ни делали, вы должны быть в состоянии как минимум определить количество нарушивших запятых, и это должно дать вам что-то (чек здравомыслия, если ничего другого).

9

вы можете использовать отрицательное LOOKAHEAD

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

+1 для использования группировки в расколотом регулярных выражений. –

+0

yah, блестящий ответ –

Смежные вопросы