web-dev-qa-db-fra.com

Analyse CSV Ruby/Rails, séquence d'octets non valide dans UTF-8

J'essaie d'analyser un fichier CSV généré à partir d'un tableur Excel.

Voici mon code

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

Mais je reçois cette erreur

ArgumentError: invalid byte sequence in UTF-8

Je pense que l'erreur est due au fait qu'Excel code le fichier dans ISO 8859-1 (Latin-1) et non dans UTF-8

Quelqu'un peut-il m'aider avec une solution de contournement à ce problème, s'il vous plaît

Merci d'avance.

37
rogeliog

Vous devez indiquer à Ruby que le fichier est au format ISO-8859-1. Changez votre ligne ouverte de fichier en ceci:

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

Le deuxième argument indique à Ruby d'ouvrir en lecture seule avec le codage ISO-8859-1.

61
Linuxios

Spécifiez le codage avecencodingoption:

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

Vous pouvez fournir un codage source directement dans le paramètre mode de fichier:

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

Enregistrez le fichier dans utf-8, sauf si pour une raison quelconque vous devez l'enregistrer différemment, auquel cas vous pouvez spécifier l'ensemble codé lors de la lecture du fichier

0
Eliza A

ajouter le second argument "r:ISO-8859-1" en tant que File.open("input_file","r:ISO-8859-1" )

0
Gagan Gami

J'avais le même problème et je n'utilisais que des feuilles de calcul Google, puis un téléchargement au format CSV. C'était la solution la plus simple. 

Puis je suis tombé sur ce petit bijou 

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

Maintenant, je n'ai plus besoin de m'inquiéter de ce problème. J'espère que cela t'aides!

0
user3787971

Si vous n'avez qu'un (ou plusieurs) fichier, il n'est donc pas nécessaire de déclarer automatiquement le codage sur le fichier que vous avez saisi en entrée, et vous avez le contenu de ce fichier visible en texte clair (txt, csv, etc.) séparé avec ie point-virgule, vous pouvez créer manuellement un nouveau fichier avec l'extension .csv et y coller le contenu de votre fichier, puis analyser le contenu comme d'habitude.

N'oubliez pas qu'il s'agit d'une solution de contournement, mais que vous avez besoin d'analyser sous Linux un seul gros fichier Excel, converti en une version de CSV, cela vous fait gagner du temps pour expérimenter tous ces encodages sophistiqués.

0
ToTenMilan