Преодоление основной проблемы с анализом CSV с использованием гема FasterCSV - PullRequest
15 голосов
/ 27 ноября 2009

Я обнаружил проблему синтаксического анализа CSV с FasterCSV (1.5.0), которая выглядит как настоящая ошибка, но я надеюсь, что есть обходной путь.

По сути, добавление пробела после разделителя (в моем случае запятой), когда поля заключены в кавычки, приводит к MalformedCSVError.

Вот простой пример:

# No quotes on fields -- works fine
FasterCSV.parse_line("one,two,three")
=> ["one", "two", "three"]

# Quotes around fields with no spaces after separators -- works fine
FasterCSV.parse_line("\"one\",\"two\",\"three\"")
=> ["one", "two", "three"]

# Quotes around fields but with a space after the first separator -- fails!
FasterCSV.parse_line("\"one\", \"two\",\"three\"")
=> FasterCSV::MalformedCSVError: Illegal quoting on line 1.

Я схожу с ума, или это ошибка в FasterCSV?

Ответы [ 3 ]

14 голосов
/ 27 ноября 2009

Здесь MalformedCSVError правильно.

Начальные / конечные пробелы в формате CSV не игнорируются, они считаются частью поля. Таким образом, это означает, что вы запустили поле с пробелом, а затем включили в него неэкранированные двойные кавычки, что приведет к ошибке недопустимого цитирования.

Может быть, эта библиотека более строгая, чем другие, которые вы использовали.

2 голосов
/ 27 ноября 2009

Я надеялся, что опция :col_sep может разрешить регулярное выражение, но, похоже, оно используется как для чтения, так и для записи, что является позором. Документация не дает особых надежд, и ваша потребность, вероятно, более неотложна, чем можно было бы удовлетворить, запросив изменение или отправив исправление; -)

Если вы звоните #parse_line явно, то вы всегда можете позвонить

gsub(/,\s*/, ',')

в вашей строке ввода. Это регулярное выражение, возможно, должно существенно измениться, если вы ожидаете возможность использования запятой внутри строк в кавычках. (Я бы предложил опубликовать такой вопрос здесь с подходящим тегом, и пусть в этом случае и мэвены RegEx проиграют).

2 голосов
/ 27 ноября 2009

Может быть, вы могли бы установить для параметра: col_sep: значение ',', чтобы он анализировал подобные файлы.

...