2012-09-02 13 views
8

W mojej aplikacji (Rails 3.0.5, Ruby 1.8.7) utworzyłem narzędzie do importowania danych CSV z pliku.Rails 3, sprawdź kodowanie pliku CSV przed zaimportowaniem

Problem: Poprosiłem moich użytkowników o wyeksportowanie pliku CSV z programu Excel w kodowaniu UTF-8, ale nie robią tego przez większość czasu.

Jak mogę sprawdzić, czy plik ma format UTF-8 przed importowaniem? Inaczej import zostanie uruchomiony, ale da dziwne wyniki. Używam FasterCSV do importowania.

Exemple złej pliku CSV:

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

Dzięki.

Odpowiedz

22

Możesz użyć Charlock Holmes, kodu kodującego bibliotekę wykrywającą dla Rubiego.

https://github.com/brianmario/charlock_holmes

Aby z niego skorzystać, wystarczy odczytać pliku i użyć metody detect.

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

Można również konwertować kodowanie UTF-8, jeśli nie jest w prawidłowym formacie:

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

Oszczędza użytkowników od konieczności zrobić to sami przed przesłaniem go ponownie.

+0

Dzięki, będę spróbować. –

+0

Działa doskonale! Wielkie dzięki. –

6

1,9 to oczywiste, wystarczy powiedzieć go oczekiwać utf8 i to podniesie błąd, jeśli to nie jest:

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

To brzmi dobrze. Nic na 1.8.7? ;) –

+0

Nie, ale dla mnie kodowanie ciągów znaków jest największą różnicą między 1.8 a 1.9, więc wygląda na to, że 1.9 jest tym, czego potrzebujesz. – pguardiario

+0

Jeśli pobierasz plik bezpośrednio z file_field_tag ​​w zmiennej, powiedzmy, że zmienna to @csv_file, w takim przypadku zamiast {lines = CSV.read ("bad.csv",: encoding => 'utf-8') } użyj {line = CSV.read (@ csv_file.tempfile, encoding: 'utf-8')} –