ti-enxame.com

Análise CSV de Ruby/Rails, sequência de bytes inválida em UTF-8

Eu estou tentando analisar um arquivo CSV gerado a partir de uma planilha do Excel.

Aqui está meu código

require 'csv'
file = File.open("input_file")
csv = CSV.parse(file)

Mas eu recebo esse erro

ArgumentError: invalid byte sequence in UTF-8

Eu acho que o erro é porque o Excel codifica o arquivo em ISO 8859-1 (Latin-1) e não em UTF-8

Alguém pode me ajudar com uma solução para este problema, por favor

Desde já, obrigado.

37
rogeliog

Você precisa dizer ao Ruby que o arquivo está em ISO-8859-1. Altere sua linha de abertura de arquivo para isto:

file=File.open("input_file", "r:ISO-8859-1")

O segundo argumento diz ao Ruby para abrir somente leitura com a codificação ISO-8859-1.

61
Linuxios

Especifique a codificação comencodingoption:

CSV.foreach(file.path, headers: true, encoding:'iso-8859-1:utf-8') do |row|
  ...
end
13
sudhir Vishwakarma

Você pode fornecer codificação de fonte diretamente no parâmetro de modo de arquivo:

CSV.foreach( "file.csv", "r:windows-1250" ) do |row|
   <your code>
end
12
kixorz

Salve o arquivo em utf-8, a menos que, por algum motivo, você precise salvá-lo de forma diferente. Nesse caso, você poderá especificar o conjunto codificado durante a leitura do arquivo.

0
Eliza A

adicione o segundo argumento "r:ISO-8859-1" como File.open("input_file","r:ISO-8859-1" )

0
Gagan Gami

Eu tive esse mesmo problema e estava usando apenas planilhas do Google e, em seguida, baixando como um arquivo CSV. Essa foi a solução mais fácil. 

Então me deparei com essa gema 

https://github.com/singlebrook/utf8-cleaner

Agora não preciso me preocupar com esse problema. Espero que isto ajude!

0
user3787971

Se você tem apenas um (ou poucos) arquivo, então quando não é necessário declarar automaticamente a codificação em qualquer arquivo que você receber da entrada, e você tem o conteúdo deste arquivo visível em texto simples (txt, csv etc) separado por exemplo, ponto-e-vírgula, você pode criar um novo arquivo com a extensão .csv manualmente, e colar o conteúdo do seu arquivo lá, então analisar o conteúdo como de costume.

Tenha em mente que esta é uma solução alternativa, mas precisa de analisar no linux apenas um arquivo grande do Excel, convertido em algum tipo de csv, poupa tempo na experimentação com todas essas codificações extravagantes

0
ToTenMilan