Не могу прочитать файл 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]

Как вы можете видеть, каждая строка представляет собой массив строк каждого столбца в документе.

Другие вопросы по тегам