RAILS 3 CSV "Незаконное цитирование" - ложь - PullRequest
1 голос
/ 20 марта 2012

Я столкнулся с проблемой при синтаксическом анализе файла CSV, когда я получаю следующую ошибку:

CSV :: MalformedCSVError: Неверное цитирование в строке 3.

Код RAILS в вопросе:

csv = CSV.read(args.local_file_path, col_sep: "\t", headers: true)

Строка 3 в файле CSV:

A-067067        VO  VIA CE  0   8   8   SWCH            Ter 4, Loc Is Here, Mne,    Per Fl                                  Auia/Sey    IMAC            NEK_HW      2011-03-09 09:47:44 2011-03-09 11:50:26 2011-01-13 10:49:17 2011-02-14 14:02:43 2011-02-14 14:02:44 0   0   771 771 46273   "[O/H 15/02] B270 W31 ""TEXT TEXT 2 X TEXT SWITC"   SOME_TEXT       SOME_TEXT       N/A Name Here                               RESOLVED_CLOSED RESOLVED_CLOSED

ОБНОВЛЕНИЕ: вкладки, кажется, не встречались выше. См. ПАСТИН RAW ТЕКСТ: http://pastebin.com/4gj7iUpP

Я прочитал многочисленные темы по всему StackOverflow и Google о том, почему это так, и я это понимаю. Но у строки CSV выше есть совершенно законное цитирование, не так ли? CSV разделен табуляцией, и с каждой стороны соответствующего столбца есть только вкладка, за которой следует кавычка. В этом поле есть 1 кавычка и двойная кавычка, чтобы избежать ее. Так что же дает? Я не могу решить это. (

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

1 Ответ

1 голос
/ 20 марта 2012

Эта часть вашего CSV виновата:

46273   "[O/H 15/02] B270 W31 ""TEXT TEXT 2 X TEXT SWITC"   SOME_TEXT

По крайней мере одна из этих частей имеет свободное пространство:

46273   "
"   SOME_TEXT

Я предполагаю, что "3" и двойник должны быть разделены одной или несколькими вкладками, но перед кавычкой есть пробел. Или после кавычки на другом конце есть пробел, когда между закрывающей кавычкой и буквой "S" должны быть только табуляции.

CSV избегает двойных кавычек, удваивая их, так что это:

"[O/H 15/02] B270 W31 ""TEXT TEXT 2 X TEXT SWITC"

предполагается, что это одно поле, содержащее вложенную цитату:

[O/H 15/02] B270 W31 "TEXT TEXT 2 X TEXT SWITC

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

Попробуйте отправить файл CSV через cat -t (который должен представлять вкладки как ^I), чтобы определить, где находится свободное место.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...