2012-09-02 13 views
8

In meiner App (Rails 3.0.5, Ruby 1.8.7) habe ich ein Import-Tool erstellt, um CSV-Daten aus einer Datei zu importieren.Rails 3, CSV-Dateicodierung vor dem Import prüfen

Problem: Ich habe meine Benutzer gebeten, die CSV-Datei aus Excel in UTF-8-Codierung zu exportieren, aber sie tun es die meiste Zeit nicht.

Wie kann ich einfach überprüfen, ob die Datei vor dem Import UTF-8 ist? Andernfalls wird der Import ausgeführt, aber es ergeben sich merkwürdige Ergebnisse. Ich verwende FasterCSV zum Importieren.

Exemple schlechter CSV-Datei:

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

Dank.

Antwort

22

Sie können Charlock Holmes, eine Zeichenerkennungsbibliothek für Ruby, verwenden.

https://github.com/brianmario/charlock_holmes

es zu nutzen, lesen Sie einfach die Datei, und verwenden Sie die detect Methode.

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

Sie können auch die Kodierung UTF-8 konvertieren, wenn es nicht im richtigen Format ist:

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

Dies spart den Anwender aus, das es selbst zu tun, bevor es erneut zu.

+0

Danke, ich es versuchen. –

+0

Es funktioniert perfekt! Ein großes Dankeschön. –

6

Für 1.9 es offensichtlich ist, sagen Sie es nur UTF-8 erwarten und es wird einen Fehler auslösen, wenn dies nicht der Fall:

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

Das klingt gut. Nichts für 1.8.7? ;) –

+0

Nein, aber für mich ist Stringcodierung der größte Unterschied zwischen 1.8 und 1.9, also scheint es, als wäre 1.9 das, was du willst. – pguardiario

+0

Wenn Sie eine Datei direkt von file_field_tag ​​in einer Variablen erhalten, sagen wir, dass die Variable @csv_file ist, in diesem Fall anstelle von {lines = CSV.read ('bad.csv',: encoding => 'utf-8') } Verwenden Sie {Zeile = CSV.read (@ csv_file.tempfile, Codierung: 'Utf-8')} –

Verwandte Themen