Не могу прочитать файл charset utf-16le, кроме как положить в ruby
Мне нужно прочитать внешний файл в ruby. Бег file -i
локально показываетtext/plain; charset=utf-16le
Я открываю его в ruby CSV с разделителем '\t', и строка отображается как:<CSV::Row "\xFF\xFEC\x00a\x00n\x00d\x00i\x00d\x00a\x00t\x00e\x00 \x00n\x00u\
...
row.to_s производит \x000\x000\x000\x001\x00\t\x00E\x00D\x00O
Бег puts row
показывает данные правильно:0001 EDOARDO A
... (значения также отображаются разборчиво в vim и LibreOffice Calc)
Любые предложения, как получить данные в рубине? Я пробовал различные комбинации открытия CSV с external_encoding: 'utf-16le', internal_encoding: "utf-8"
и т.д., но puts
это единственное, что дает разборчивые значения
Это также сказал ASCII-8BIT в рубине CSV.<#CSV io_type:StringIO encoding:ASCII-8BIT lineno:0 col_sep:"\\t" row_sep:"\n" quote_char:"\"" headers:true>
Сам файл был создан как файл XLS. Я загрузил отредактированную версию здесь (отредактированный я gvim)
2 ответа
Проблема заключалась в том, что я читал из вложения Paperclip, для которого нужно было установить кодировку (переопределить) перед сохранением.
Добавление s3_headers в модель сработало:
has_attached_file :attachment, s3_headers: lambda { |attachment|
{
'content-Type' => 'text/csv; charset=utf-16le'
}
}
Спасибо Жюльену за сообщение, что проблема связана с приложением скрепки (это решение работает для непосредственного чтения файла)
Это работает нормально для меня:
require 'csv'
CSV.foreach("file.xls", encoding: "UTF-16LE:UTF-8", col_sep: "\t") do |row|
puts row.inspect
end
это даст следующий результат:
["Candidate number", "First name", "Last name", "Date of birth", "Preparation centre", "Result", "Score", "Reading and Writing", "Listening", "Speaking", "Result enquiry", "Raised on", "Raised by", "Enquiry status", "Withdrawn on", "Withdrawn by", nil]
["0001", "EDOARDO", "AGNEW", "20/01/2001", "Fondazione Istituto Massimo", "RY5-G8-Y2", "-", nil, nil, nil, "-", "00000000", nil, nil, "00000000", nil, nil]
Как вы можете видеть, каждая строка представляет собой массив строк каждого столбца в документе.