2009-10-10 21 views
11

Sto utilizzando la libreria CSV di Ruby per analizzare alcuni file CSV. Ho un file CSV apparentemente ben formato che ho creato esportando un file Excel come CSV.Ruby: impossibile analizzare il file Excel esportato come CSV in OS X

Tuttavia CSV.open(filename, 'r') causa un CSV::IllegalFormatError.

Nel file non sono presenti virgole o virgolette, né alcunché che possa causare problemi.

Sospetto che il problema potrebbe riguardare le terminazioni di linea. Sono in grado di analizzare i dati inseriti manualmente tramite un editor di testo (Aquamacs). È proprio quando provo con i dati esportati da Excel (per OS X) che si verificano problemi. Quando apro il file CSV esportato in vim, tutto il testo viene visualizzato su una riga, con ^M visualizzato tra le righe.

Dai documenti, sembra che sia possibile fornire open con un separatore di riga; tuttavia non sono sicuro di cosa dovrebbe essere in questo caso.

risposta

35

provare: CSV.open('filename', 'r', ?,, ?\r)

Come cantlin note, per Ruby 2 è:

CSV.new('file.csv', 'r', :col_sep => ?,, :row_sep => ?\r) 

Sono abbastanza sicuro che questi saranno dtrt per voi. È inoltre possibile "fissare" il file stesso (in questo caso a mantenere il vecchio open) con la vim seguente comando: :%s/\r/\r/g

sì, lo so che il comando si presenta come un totale no-op, ma funzionerà.

+0

grazie mille - vorrei averti sviato due volte per due utili bit di informazioni. – grifaton

+0

Puoi chiarire cosa sta facendo?? ,,? \ R'? Grazie! –

+0

? X restituisce il punto di codice per il carattere x, cioè un numero. Per qualche ragione, questo è ciò che CSV.open si aspetta di vedere. Quindi specifichiamo il separatore di campo come ',' e il separatore di record come altrimenti problematico^M, alias 015, alias 13, ovvero CR. A proposito, il comando vim sostituto funziona perché '\ r' significa CR nel pattern ma NL nella sostituzione, quindi non è in realtà un no-op. – DigitalRoss

0

""" Quando apro il CSV esportato in vim, appare tutto il testo su una riga, con^M appare tra le righe.

Dalla documentazione, sembra che è possibile fornire aperta con un separatore di riga, tuttavia non sono sicuro di ciò che dovrebbe essere in questo caso. "" "

Leggi indietro una frase ...^M significa tastiera Ctrl-M aka '\ x0D' (M è la tredicesima lettera del Alfabeto ASCII; 0x0D == 13) alias ASCII CR (ritorno a capo) aka '\ r' ... IOW che i Mac usavano come terminatore di riga prima di OS X.

4

Un'altra opzione è aprire il file CSV o il foglio di calcolo originale in Excel e salvarlo come "Separato da virgola di Windows" anziché "Valori separati da virgola". Questo produrrà il file con terminazioni di riga che FasterCSV è in grado di capire.

+0

Sprecato un'ora su questo, grazie mille! – Joelio

5

Spogliarello r \ personaggi sembrava funzionare per me

CSV.parse(File.read('filename').gsub(/\r/, ' ')) do |row| 
    ... 
end 
0

Sembra versioni più recenti del parser CSV e/o di qualsiasi componente utilizza leggere fine riga DOS/Windows senza problemi. Lo stock di Mac OS X (non è sicuro della versione) non lo stava tagliando, ha installato Ruby 2.0.0 e ha analizzato il file bene, senza gli argomenti speciali ...

0

Ho avuto un problema simile. Ho ricevuto un errore:

"error_message"=>"Illegal quoting in line 1.", "error_class"=>"CSV::MalformedCSVError" 

Il problema era che il file aveva terminazioni di linea di Windows, che ovviamente sono diverse da Unix.Ciò che mi ha aiutato è stata la definizione di row_sep: "\ r \ n":

CSV.open(path, 'w', headers: :first_row, col_sep: ';', quote_char: '"', row_sep: "\r\n") 
Problemi correlati