2012-09-02 9 views
8

En mi aplicación (Rails 3.0.5, Ruby 1.8.7), creé una herramienta de importación para importar datos CSV del archivo.Rieles 3, compruebe la codificación del archivo CSV antes de la importación

Problema: Pedí a mis usuarios que exportaran el archivo CSV desde Excel en codificación UTF-8, pero no lo hacen la mayor parte del tiempo.

¿Cómo puedo verificar si el archivo es UTF-8 antes de importar? De lo contrario, la importación se ejecutará pero dará resultados extraños. Yo uso FasterCSV para importar.

Exemple de malas archivo CSV:

;VallÈe du RhÙne;CÙte Rotie; 

Gracias.

Respuesta

22

Puede usar Charlock Holmes, una biblioteca de detección de codificación de caracteres para Ruby.

https://github.com/brianmario/charlock_holmes

Para usarlo, usted acaba de leer el archivo y utilizar el método detect.

contents = File.read('test.xml') 
detection = CharlockHolmes::EncodingDetector.detect(contents) 
# => {:encoding => 'UTF-8', :confidence => 100, :type => :text} 

También puede convertir la codificación UTF-8 si no está en el formato correcto:

utf8_encoded_content = CharlockHolmes::Converter.convert contents, detection[:encoding], 'UTF-8' 

Esto ahorra a los usuarios de tener que hacerlo ellos mismos antes de subirlo de nuevo.

+0

Gracias, voy a probarlo. –

+0

¡Está funcionando perfectamente! Un gran agradecimiento –

6

Por 1.9 es obvio, le dices que esperar UTF-8 y se generará un error si no lo es:

begin 
    lines = CSV.read('bad.csv', :encoding => 'utf-8') 
rescue ArgumentError 
    puts "My users don't listen to me!" 
end 
+0

Esto suena bien. Nada para 1.8.7? ;) –

+0

No, pero para mí las codificaciones de cadena es la mayor diferencia entre 1.8 y 1.9, así que parece que 1.9 es lo que quieres. – pguardiario

+0

Si obtiene un archivo directamente de file_field_tag ​​en una variable, supongamos que esa variable es @csv_file, en ese caso en lugar de {lines = CSV.read ('bad.csv',: encoding => 'utf-8') } use {line = CSV.read (@ csv_file.tempfile, codificando: 'utf-8')} –

Cuestiones relacionadas