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