Преодоление основной проблемы с разбором CSV с помощью гем FasterCSV

Я обнаружил проблему с разбором 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?


person Olly    schedule 27.11.2009    source источник


Ответы (3)


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

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

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

person Ben James    schedule 27.11.2009
comment
Разве пробел не говорит о том, что поле на самом деле не заключено в кавычки (поскольку первый символ не является кавычкой) и что кавычки следует рассматривать как часть содержимого поля? - person Vincent Robert; 27.11.2009
comment
Похоже, я ошибаюсь. Если поля не заключены в двойные кавычки, то двойные кавычки могут не появляться внутри полей. -- tools.ietf.org/html/rfc4180#section-2 - person Vincent Robert; 27.11.2009
comment
Вы правы, я не знал, что для CSV существует «спецификация», но кажется, что она есть. FasterCSV действительно очень строгий. - person Olly; 30.11.2009

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

person Robert Massa    schedule 27.11.2009

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

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

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

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

person Mike Woodhouse    schedule 27.11.2009