2015-05-21 13 views
5

Sto generando file CSV che devono essere aperti e revisionati in Excel una volta che sono stati generati. Sembra che Excel richieda una codifica diversa da UTF-8.Ruby: Come generare file CSV con codifica Excel-friendly

Ecco la mia configurazione e generazione di codice:

csv_config = {col_sep: ";", 
       row_sep: "\n", 
       encoding: Encoding::UTF_8 
      } 

csv_string = CSV.generate(csv_config) do |csv| 
    csv << ["Text a", "Text b", "Text æ", "Text ø", "Text å"] 
end 

Quando si apre questo in Excel, i caratteri speciali non sono visualizzati correttamente:

Text a Text b Text æ Text ø Text å 

Qualsiasi idea di come garantire la codifica appropriata?

+0

Prova a mettere # codifica: UTF-8' come prima riga del tuo file Ruby (seconda se hai una linea hash-bang, '#!/Usr/bin/env ruby'). Credo che tu stia scrivendo * in UTF-8, ma il file sorgente Ruby è considerato codificato come US_ASCII. (Con Ruby 2.0+, la codifica sorgente è impostata su UTF-8) – Amadan

+0

Sto usando 'ruby 2.0.0p247 (2013-06-27 revisione 41674) [x86_64-darwin12.4.0]' quindi suppongo che ciò significhi che la mia installazione è già impostazione predefinita su UTF-8. – ChristofferJoergensen

+2

Nessuna esperienza con Ruby. Ma Excel può aprire file CSV delimitati da punti e virgola che sono codificati in UTF-8. Ma il file deve avere una BOM all'inizio. E se il punto e virgola può essere utilizzato come delimitatore dipende dalle impostazioni internazionali. Quindi l'approccio migliore è usare il CSV delimitato da tabulazioni e quelli codificati da UTF-16LE. Questo dovrebbe essere la maggior parte delle impostazioni internazionali indipendenti. –

risposta

7

Si dovrebbe cambiare la codifica a ISO-8859-1 come segue:

CSV.generate(encoding: 'ISO-8859-1') { |csv| csv << ["Text á", "Text é", "Text æ"] } 

Per il vostro contesto, si può fare questo:

config = { 
    col_sep: ';', 
    row_sep: ';', 
    encoding: 'ISO-8859-1' 
} 

CSV.generate(config) { |csv| csv << ["Text á", "Text é", "Text æ"] } 

ho avuto lo stesso problema e che la codifica fissa.

+0

La risposta sopra ha funzionato per me, ma solo dopo aver rimosso gli argomenti 'col_sep' e' row_sep'. Solo la 'codifica: 'ISO-8859-1'' era tutto ciò di cui avevo bisogno.Per il contesto, il problema specifico che stavo avendo era caratteri 'é' che apparivano come' ' –

+0

Buona cattura Greg, aggiornerò l'esempio senza il contesto. – joaofraga

5

La risposta più votata di @joaofraga ha funzionato per me, ma ho trovato una soluzione alternativa che ha funzionato anche: non è necessaria la transcodifica da UTF-8 a ISO-8859-1.

Da quello che ho letto, Excel, può effettivamente gestire UTF-8, ma per qualche motivo, non lo riconosce per impostazione predefinita. Ma se si aggiunge una distinta base all'inizio del dato CSV, sembra che Excel si accorga che il file è UTF-8.

Quindi, se si dispone di un file CSV in questo modo:

csv_string = CSV.generate(csv_config) do |csv| 
    csv << ["Text a", "Text b", "Text æ", "Text ø", "Text å"] 
end 

Basta aggiungere un byte BOM in questo modo:

"\uFEFF" + csv_string 

Nel mio caso, il mio controller sta inviando il CSV come file, quindi questo è ciò che il mio controller appare come:

def show 
    respond_to do |format| 
    format.csv do 
     # add BOM to force Excel to realise this file is encoded in UTF-8, so it respects special characters 
     send_data "\uFEFF" + csv_string, type: :csv, filename: "csv.csv" 
    end 
    end 
end 

Vorrei sottolineare che UTF-8 si non lo fa req uire o raccomandare un BOM a tutti, ma come ho detto, aggiungendolo in questo caso sembrava spingere Excel a rendersi conto che il file era effettivamente UTF-8.

+0

il bel trucco sembra funzionare ora su Excel –

Problemi correlati