Не могу прочитать файл charset utf-16le, кроме как положить в ruby - PullRequest
0 голосов
/ 05 мая 2019

Мне нужно прочитать внешний файл в ruby.Запуск file -i локально показывает text/plain; charset=utf-16le

Я открываю его в CSV-файле ruby ​​с разделителем '\ 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)

Любые предложения, как получить данные в ruby?Я пробовал различные комбинации открытия CSV с помощью external_encoding: 'utf-16le', internal_encoding: "utf-8" и т. Д., Но puts - единственное, что дает четкие значения

Также указано ASCII-8BIT в ruby ​​CSV.<#CSV io_type:StringIO encoding:ASCII-8BIT lineno:0 col_sep:"\\t" row_sep:"\n" quote_char:"\"" headers:true>

Сам файл был создан как файл XLS.Я загрузил отредактированную версию здесь (отредактировано i gvim)

Ответы [ 2 ]

1 голос
/ 11 мая 2019

Это нормально работает для меня:

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]

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

0 голосов
/ 13 мая 2019

Проблема заключалась в том, что я читал из приложения Paperclip, для которого необходимо было установить кодировку (переопределить) перед сохранением.

Добавление s3_headers в работающую модель:

 has_attached_file :attachment, s3_headers: lambda { |attachment|
                                  { 
                                    'content-Type' => 'text/csv; charset=utf-16le'
                                  }
                                }

Спасибо Жюльену за сообщение, что проблема связана с вложением скрепки (это решение работает для непосредственного чтения файла)

...