Как изменить кодировку при разборе CSV в Rails - PullRequest
11 голосов
/ 16 августа 2011

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

csv = CSV.parse(output, :headers => true, :col_sep => ";")
csv.each do |row|
  row = row.to_hash.with_indifferent_access
  insert_data_method(row)
end

Когда я читаю свой файл, я получаю эту ошибку:

Encoding::CompatibilityError in FileImportingController#load_file
incompatible character encodings: ASCII-8BIT and UTF-8

Я читал о row.force_encoding('utf-8'), но это не работает:

NoMethodError in FileImportingController#load_file
undefined method `force_encoding' for #<ActiveSupport::HashWithIndifferentAccess:0x2905ad0>

Спасибо.

Ответы [ 3 ]

15 голосов
/ 14 ноября 2012

Мне пришлось читать файлы CSV, закодированные в ISO-8859-1.Выполнение задокументированного

CSV.foreach(filename, encoding:'iso-8859-1:utf-8', col_sep: ';', headers: true) do |row|

вызвало исключение

ArgumentError: invalid byte sequence in UTF-8
    from csv.rb:2027:in '=~' 
    from csv.rb:2027:in 'init_separators' 
    from csv.rb:1570:in 'initialize' 
    from csv.rb:1335:in 'new' 
    from csv.rb:1335:in 'open' 
    from csv.rb:1201:in 'foreach'

, поэтому я прочитал файл и преобразовал его в UTF-8 во время чтения, а затем проанализировал строку:

CSV.parse(File.open(filename, 'r:iso-8859-1:utf-8'){|f| f.read}, col_sep: ';', headers: true, header_converters: :symbol) do |row|
    pp row
end
4 голосов
/ 16 августа 2011

force_encoding предназначен для запуска на строке, но похоже, что вы вызываете его для хэша. Вы могли бы сказать:

output.force_encoding('utf-8')
csv = CSV.parse(output, :headers => true, :col_sep => ";")
...
0 голосов
/ 10 июля 2014

Эй, я написал небольшое сообщение в блоге о том, что я сделал, но это немного более многословно, чем то, что уже было опубликовано. По какой-то причине я не смог заставить эти решения работать, и это сработало.

Суть в том, что я просто заменяю (или в моем случае удаляю) недействительные / неопределенные символы в моем файле, а затем переписываю его. Я использовал этот метод для преобразования файлов:

def convert_to_utf8_encoding(original_file)  
  original_string = original_file.read
  final_string = original_string.encode(invalid: :replace, undef: :replace, replace: '') #If you'd rather invalid characters be replaced with something else, do so here.
  final_file = Tempfile.new('import') #No need to save a real File
  final_file.write(final_string)
  final_file.close #Don't forget me
  final_file
end 

Надеюсь, это поможет.

Редактировать: здесь не указывается кодировка назначения, потому что кодирование предполагает, что вы кодируете кодировку по умолчанию, которая для большинства приложений Rails - UTF-8 (я полагаю)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...