Ruby: невозможно проанализировать файл Excel, экспортированный как CSV в OS X - PullRequest
11 голосов
/ 11 октября 2009

Я использую библиотеку CSV в Ruby для анализа некоторых CSV. У меня есть, казалось бы, правильно сформированный файл CSV, который я создал путем экспорта файла Excel в формате CSV.

Однако CSV.open(filename, 'r') вызывает CSV::IllegalFormatError.

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

Я подозреваю, что проблема может быть связана с окончанием строки. Я могу анализировать данные, введенные вручную через текстовый редактор (Aquamacs). Проблемы возникают только тогда, когда я пытаюсь экспортировать данные из Excel (для OS X). Когда я открываю экспортированный файл CSV в vim, весь текст появляется в одной строке, между строк появляется ^M.

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

Ответы [ 6 ]

35 голосов
/ 11 октября 2009

Попробуйте: CSV.open('filename', 'r', ?,, ?\r)

Как примечания cantlin , для Ruby 2 это:

CSV.new('file.csv', 'r', :col_sep => ?,, :row_sep => ?\r)

Я почти уверен, что это будет DTRT для вас. Вы также можете «исправить» сам файл (в этом случае сохраните старый open) с помощью следующей команды vim: :%s/\r/\r/g

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

5 голосов
/ 23 августа 2011

Раздевание \ r символов, похоже, работает для меня

CSV.parse(File.read('filename').gsub(/\r/, ' ')) do |row|
  ...
end
4 голосов
/ 20 ноября 2009

Другой вариант - открыть файл CSV или исходную электронную таблицу в Excel и сохранить ее как «Windows Comma Separated», а не «Comma Separated Values». Это выведет файл с окончаниями строк, которые FasterCSV сможет понять.

0 голосов
/ 06 августа 2014

У меня была похожая проблема. Я получил ошибку:

"error_message"=>"Illegal quoting in line 1.", "error_class"=>"CSV::MalformedCSVError"

Проблема заключалась в том, что в файле были окончания строки в Windows, которые, конечно, отличны от Unix. Мне помогло определение row_sep: "\ r \ n":

CSV.open(path, 'w', headers: :first_row, col_sep: ';', quote_char: '"', row_sep: "\r\n") 
0 голосов
/ 19 сентября 2013

Кажется, более новые версии синтаксического анализатора CSV и / или любого компонента, который он использует, читают окончания строк DOS / Windows без проблем. Стандартный Mac OS X (не уверен, что версия) не обрезал его, установил Ruby 2.0.0, и он анализировал файл без особых аргументов ...

0 голосов
/ 11 октября 2009

""» Когда я открываю экспортированный файл CSV в vim, весь текст отображается в одной строке, а ^ M появляется между строк.

Из документации кажется, что вы можете предоставить open с разделителем строк; Однако я не уверен, что это должно быть в этом случае. "" "

Прочитать обратно предложение ... ^ M означает клавиатуру Ctrl-M, также называемую '\ x0D' (M - 13-я буква алфавита ASCII; 0x0D == 13), также называемая ASCII CR (возврат каретки), также называемая '\ r' ... IOW, что раньше использовали Mac в качестве разделителя строк перед OS X.

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