Преодоление основной проблемы с синтаксическим разбором 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?

Ответы

Ответ 1

Здесь MalformedCSVError.

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

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

Ответ 2

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

Ответ 3

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

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

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

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