51 votes

Analyse CSV Ruby/Rails, séquence d'octets invalide en UTF-8

J'essaie d'analyser un fichier CSV généré à partir d'une feuille de calcul 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 encode le fichier en ISO 8859-1 (Latin-1) et non dans UTF-8

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

Merci d'avance.

0 votes

La meilleure solution est de faire coder Excel en utf-8.

0 votes

Si vous avez besoin de prendre en charge différents encodages et de les détecter à l'importation, Charlock Holmes a bien fonctionné pour moi. Voir stackoverflow.com/a/12234195/1343535

73voto

Linuxios Points 16966

Vous devez indiquer à Ruby que le fichier est en ISO-8859-1. Changez votre ligne d'ouverture de fichier en ceci :

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

Le second argument indique à Ruby d'ouvrir en lecture seule avec l'encodage ISO-8859-1.

0 votes

Cela me posait aussi des problèmes, et votre solution fonctionne jusqu'à présent pour moi ! Merci !

2 votes

A fonctionné comme un champion. Je faisais un iconv -f ISO-8859-1 -t utf-8 oldfilename > newfilename avant de trouver cette réponse.

1 votes

@jnunn : Ravi d'avoir pu aider ! Les encodages Ruby sont des choses difficiles, et pas si faciles à gérer.

35voto

Spécifiez l'encodage avec encoding option :

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

3 votes

Je préfère déclarer les arguments des mots-clés de manière explicite +1 pour les encoding:

11voto

napalm Points 348

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

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

9 votes

Cela fonctionnait dans Ruby 2.1.5 mais vous devez faire encoding: 'iso-8859-1' au lieu de "r:windows-1250" .

0voto

Eliza A Points 86

Enregistrez le fichier en utf-8, sauf si pour une raison quelconque vous devez l'enregistrer différemment, auquel cas vous pouvez spécifier le jeu d'encodage lors de la lecture du fichier.

0voto

Gagan Points 512

Ajouter un second argument "r:ISO-8859-1" comme File.open("input_file","r:ISO-8859-1" )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X