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