2009-11-27 4 views
15

Ho trovato un problema di analisi CSV con FasterCSV (1.5.0), che sembra un vero bug, ma spero che ci sia una soluzione alternativa.Superare un problema di base con l'analisi CSV utilizzando la gemma FasterCSV

Fondamentalmente, aggiungendo uno spazio dopo il separatore (nel mio caso una virgola) quando i campi sono racchiusi tra virgolette genera un MalformedCSVError.

Ecco un semplice esempio:

# No quotes on fields -- works fine 
FasterCSV.parse_line("one,two,three") 
=> ["one", "two", "three"] 

# Quotes around fields with no spaces after separators -- works fine 
FasterCSV.parse_line("\"one\",\"two\",\"three\"") 
=> ["one", "two", "three"] 

# Quotes around fields but with a space after the first separator -- fails! 
FasterCSV.parse_line("\"one\", \"two\",\"three\"") 
=> FasterCSV::MalformedCSVError: Illegal quoting on line 1. 

vado pazzo, o si tratta di un bug in FasterCSV?

risposta

14

Il MalformedCSVError è corretto qui.

Gli spazi iniziali/finali nel formato CSV non vengono ignorati, sono considerati parte di un campo. Questo significa che hai iniziato un campo con uno spazio, quindi hai incluso le virgolette doppie senza escape in quel campo, il che causerebbe l'errore di quotazione illegale.

Forse questa libreria è solo più rigoroso rispetto ad altri che avete utilizzato.

+0

per Non è lo spazio dicendo che il campo è in realtà non è circondato da citazioni (dal momento che il primo carattere non è una citazione) e che le citazioni dovrebbero essere prese come parte del contenuto del campo? –

+1

Sembra che mi sbaglio. "Se i campi non sono racchiusi tra virgolette doppie, le doppie virgolette potrebbero non apparire all'interno dei campi." - http://tools.ietf.org/html/rfc4180#section-2 –

+0

Hai ragione, non mi rendevo conto che esisteva una "specifica" per CSV ma sembra che ci sia. FasterCSV è davvero molto severo. – Olly

2

Forse potresti impostare: col_sep: opzione su "," per fare in modo che analizzi i file in quel modo.

2

Speravo che l'opzione :col_sep potesse consentire un'espressione regolare, ma sembra essere utilizzata sia per la lettura che per la scrittura, il che è un peccato. Il documentation non detiene molte speranze e il tuo bisogno è probabilmente più immediato di quello che potrebbe essere soddisfatta da richiedere una modifica o di inviare una patch ;-)

Se chiami #parse_line in modo esplicito, allora si potrebbe sempre chiamare

gsub(/,\s*/, ',') 

sulla linea di input. Quella espressione regolare potrebbe dover cambiare in modo significativo se si anticipa la possibilità di virgole all'interno di stringhe tra virgolette. (Suggerirei di ripubblicare una domanda del genere qui con un tag adatto e lasciare che la RegEx si allenti su di esso dovrebbe essere così).

Problemi correlati