Ruby: Как я могу обработать файл CSV с "плохими запятыми"? - PullRequest
1 голос
/ 19 октября 2010

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

Например, название компании может быть "Dog Widgets, Inc." но CSV не заключает в кавычки эту строку, поэтому любой синтаксический анализатор CSV считает эту запятую перед "Inc." начало нового поля.

Есть ли способ надежного анализа этих строк с помощью Ruby?

Единственная отличительная черта, которую я могу найти, заключается в том, что запятые, являющиеся частью строки, после этого имеют пробел. Запятые, которые разделяют поля, не имеют пробелов. Понятия не имею, как это помогает мне разобрать это, но я кое-что заметил.

Ответы [ 4 ]

9 голосов
/ 19 октября 2010

вы можете использовать отрицательный взгляд

>> "foo,bar,baz,pop, blah,foobar".split(/,(?![ \t])/)
=> ["foo", "bar", "baz", "pop, blah", "foobar"]
1 голос
/ 19 октября 2010

Возможно, что-то в этом духе ..

, используя 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"
]

и затем удалите |после слов.

1 голос
/ 19 октября 2010

Что ж, вот вам идея: вы можете заменить каждый экземпляр запятой, следующим за пробелом, уникальным символом, затем проанализировать CSV как обычно, затем пройти через полученные строки и отменить замену.

0 голосов
/ 19 октября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...