2009-11-24 11 views
0

J'ai une application dans laquelle nos clients téléchargent un fichier csv sur notre serveur. Nous traitons ensuite et mettons les données du csv dans notre base de données. Nous rencontrons quelques problèmes avec les jeux de caractères, en particulier lorsque nous traitons avec JSON, en particulier certains caractères UTF-8 non convertis brisent IE sur les réponses JSON.Conversion d'un jeu de fichiers avec Ruby

Existe-t-il un moyen de convertir le fichier CSV téléchargé en UTF-8 avant de commencer à le traiter? Existe-t-il un moyen de déterminer l'encodage de caractères d'un fichier téléchargé? J'ai un peu joué avec iconv mais nous ne sommes pas toujours sûrs de l'encodage du fichier téléchargé. Merci.

Répondre

2

Cette solution pourrait ne pas être idéale, mais devrait faire le travail.

d'abord, les ingrédients:

  • chardet (sudo gem install chardet)
  • fastercsv (sudo gem install fastercsv)

Maintenant, le code réel (non testé):

require 'rubygems' 
require 'UniversalDetector' 
require 'fastercsv' 
require 'iconv' 

file_to_import = File.open("path/to/your.csv") 
# determine the encoding based on the first 100 characters 
chardet = UniversalDetector::chardet(file_to_import.read[0..100]) 
if chardet['confidence'] > 0.7 
    charset = chardet['encoding'] 
else 
    raise 'You better check this file manually.' 
end 
file_to_import.each_line do |l| 
    converted_line = Iconv.conv('utf-8', charset, l) 
    row = FasterCSV.parse(converted_line)[0] 
    # do the business here 
end 
+0

est de 100 caractères assez? – rwilliams

+0

Changez simplement ce qui fonctionne pour les fichiers avec lesquels vous travaillez. Vous pouvez analyser le fichier entier s'il est raisonnablement petit. –

+0

FYI la gemme "chardet" ne semble pas fonctionner dans Ruby 1.9 - J'utilise avec succès la gemme "rchardet19". –