Ruby: не удается проанализировать файл Excel, экспортированный как CSV в OS X

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

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

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

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

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

Ответ 1

Попробуйте: 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

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

Ответ 2

Зачистки\r персонажей, казалось, работали для меня

CSV.parse(File.read('filename').gsub(/\r/, ' ')) do |row|
  ...
end

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

"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")