2009-11-27 3 views
15

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

В принципе, добавление пробела после разделителя (в моем случае запятая), когда поля заключены в кавычки, генерирует 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. 

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

ответ

14

MalformedCSVError верен.

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

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

+0

Разве это не пространство, говорящее, что поле фактически не окружено кавычками (поскольку первый символ не является цитатой) и что кавычки должны быть взяты как часть содержимого поля? –

+1

Похоже, я ошибаюсь. «Если поля не заключены в двойные кавычки, тогда двойные кавычки могут не отображаться внутри полей». - http://tools.ietf.org/html/rfc4180#section-2 –

+0

Вы правы, я не понимал, что для CSV существует «спецификация», но кажется, что есть. FasterCSV действительно просто очень строгий. – Olly

2

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

2

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

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

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

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

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