Perché una virgola è un separatore / delimitatore di record non valido nei file CSV?


32

Stavo leggendo questo articolo e sono curioso di trovare la risposta adeguata a questa domanda.

L'unica cosa che mi viene in mente è forse che in alcuni paesi il separatore decimale è una virgola e potrebbe essere un problema quando si condividono dati in CSV , ma non sono davvero sicuro della mia risposta.


6
Quasi ogni delimitatore è meglio di una virgola. Il motivo è che, quando i file delimitati da virgole vengono letti in alcuni strumenti di analisi dei dati, le virgole possono essere confuse con la punteggiatura, interrompendo il "layout" dei campi o delle colonne.
Mike Hunter,

33
Un cinico, notando che questo articolo è un pezzo puff SAS, potrebbe suggerire che forse SAS ha problemi nell'elaborazione di file CSV con virgole :-).
whuber

3
@whuber - SAS (nella mia esperienza) può avere problemi con i file CSV, che siano virgole o meno, che richiedono enormi quantità di codifica manuale per ogni cosa strana che a SAS non piace.
Jeremy Miles,

8
C'è una disperazione nella ricerca di delimitatori sempre più oscuri - pipe, cavoli, spine - che suggerisce che concordare e seguire uno standard sia davvero l'unico modo sicuro per le persone di scambiare dati in file di testo delimitati. E uno standard universale deve consentire a qualsiasi stringa di testo di essere rappresentata (come fa RFC4180), piuttosto che basarsi sul presupposto che alcuni non avranno bisogno di essere e possono essere messi su altri lavori.
Scortchi - Ripristina Monica

2
(a) Ho spesso importato con successo file .csv. (b) Consiglio alle persone di non usare .csv se hanno delle virgole nei loro dati. Questi non si contraddicono a vicenda. È un peccato che (b) abbia bisogno di spiegazioni in alcuni settori.
Nick Cox,

Risposte:


33

Le specifiche del formato CSV sono definite in RFC 4180 . Questa specifica è stata pubblicata perché

non esistono specifiche formali che consentano un'ampia varietà di interpretazioni dei file CSV

Sfortunatamente, dal 2005 (data di pubblicazione della RFC), nulla è cambiato. Abbiamo ancora un'ampia varietà di implementazioni. L'approccio generale definito in RFC 4180 è quello di racchiudere i campi contenenti caratteri come virgole tra virgolette, tuttavia questa raccomandazione non è sempre soddisfatta da software diverso.

Il problema è che in varie lingue europee il carattere virgola funge da punto decimale, quindi scrivi 0,005invece di 0.005. Tuttavia, in altri casi, al posto degli spazi vengono utilizzate le virgole per segnalare gruppi di cifre, ad es. 4,000,000.00(Vedere qui ). In entrambi i casi l'uso delle virgole potrebbe comportare errori nella lettura dei dati dai file CSV perché il tuo software non sa davvero se ci 0,005, 0,1sono due numeri o quattro numeri diversi (vedi esempio qui ).

Ultimo ma non meno importante, se si memorizza il testo nel file di dati, le virgole sono molto più comuni nel testo rispetto, ad esempio, al punto e virgola, quindi se il testo non è racchiuso tra virgolette, tali dati possono anche essere facilmente letti con errori .

Nulla rende le virgole migliori, o peggio separatori di campo per quanto riguarda i file CSV utilizzati in conformità con le raccomandazioni RFC 4180 che proteggono dai problemi sopra descritti. Tuttavia, se esiste il rischio di utilizzare il formato CSV semplificato che non racchiude i campi tra virgolette o la raccomandazione potrebbe essere utilizzata in modo incoerente, allora altri separatori (ad esempio punto e virgola) sembrano essere un approccio più sicuro.


6
Bene, qualsiasi software che implementa l'attuale standard CSV come definito da RFC 4180 saprebbe sicuramente esattamente come interpretare una determinata stringa. L'argomento secondo cui l'utilizzo al ,posto di un separatore più raro gonfia i dati perché è necessario sfuggirli continuamente è vero. E ovviamente ci sono tutte quelle persone che pensano di sapere come funziona CSV ma in realtà no.
Voo,

2
@Voo Sì, ma poiché i file "csv" vengono utilizzati in modo così caotico, è più sicuro non utilizzare le virgole e invece di utilizzare altri separatori, ad esempio i punti e virgola. Questa è la risposta alla domanda OP. Non c'è niente di "migliore" nei punti e virgola (o in altre non virgole) rispetto alle virgole, in molti casi sono semplicemente una scelta più sicura.
Tim

2
@Voo +1 al tuo commento. Tuttavia, a chiunque stia usando CSV non importa davvero dei file di dati gonfiati!
whuber

17

Tecnicamente la virgola è valida come qualsiasi altro carattere da utilizzare come separatore. Il nome del formato indica direttamente che i valori sono separati da virgola (Valori separati da virgola).

La descrizione del formato CSV utilizza la virgola come separatore.

Qualsiasi campo contenente virgola deve essere racchiuso tra virgolette. Ciò non causa problemi nella lettura dei dati. Vedere il punto 6 dalla descrizione :

  1. I campi che contengono interruzioni di riga (CRLF), virgolette doppie e virgole devono essere racchiusi tra virgolette doppie.

Ad esempio le funzioni read.csve write.csvda R per impostazione predefinita utilizzano la virgola come separatore.


4
Questa è la risposta migliore, in quanto si riferisce a valuesche sono separati da virgola. Altri alludendo all'europeo formattingdei numeri, questo non è un problema per il CSV standard, poiché citi correttamente il punto 6 sopra. Divergenze di "uso corretto" esistono con qualsiasi formato di dati. Il punto è: conosci i tuoi dati. Altri citano tabo ;delimitano, tuttavia questi possono avere gli stessi problemi delle virgole quando si ha a che fare con dati immessi dall'utente (forse tramite un modulo e acquisiti da un database - ho dovuto lottare con campi di immissione di testo gratuiti che le persone hanno le dita grasse tab... fa schifo)
Adrian Torrie il

La risposta di Tim è stata ora modificata per includere le informazioni fornite da @djhurio.
Adrian Torrie,

11

Oltre ad essere un separatore di cifre in numeri, fa anche parte dell'indirizzo (come l'indirizzo del cliente, ecc.) In molti paesi. Mentre alcuni paesi hanno indirizzi brevi e ben definiti, molti altri hanno indirizzi tortuosi, tra cui, a volte, due virgole nella stessa riga. I buoni file CSV racchiudono tutti questi dati tra virgolette doppie. Ma i parser troppo semplicistici e scritti male non prevedono la lettura e la differenziazione. (Quindi, c'è il problema di usare virgolette doppie come parte dei dati, come la citazione da una poesia).


2
(+1) Lo standard prevede l'uso di doppie virgolette come parte dei dati insistendo nel raddoppiarle di nuovo: "Belloc", "Tarantella", "" "le pulci che prendono in giro negli Alti Pirenei" "". In Inghilterra non è raro trovare campi di indirizzi contenenti il ​​nome di una casa tra virgolette, quindi: "Chatsworth", Melton Road, Leamington. (Non è chiaro il perché: Fowler borbottò che "l'implicazione sembra essere: vivere nella casa che le persone sensibili chiamano" 164 Melton Road ", ma a uno sciocco piace chiamare" Chatsworth "".)
Scortchi - Reinstate Monica

1
@Scortchi Sembra che abbiamo imparato le stesse poesie a 12 anni (errore +/-). Temo che quello che ho letto come uno sfortunato snobismo inglese all'inizio del 20 ° secolo dell'alta classe media per le abitudini della classe media inferiore oscura il tuo ultimo esempio, che non sarà trasparente al di là di un piccolo gruppo.
Nick Cox,

@NickCox: dodici suonano a destra. Divertente che non riesco a ricordare se ho letto qualche poesia quest'anno, figuriamoci a ricordare qualche riga da loro. Sebbene il punto di Fowler riguardasse l'effetto sul lettore di virgolette non necessarie (vedi unnecessaryquotes.com ), penso che tu abbia ragione a vedere l'influenza dello snobismo nella sua scelta dell'esempio. Ad ogni modo, spero che il punto piuttosto secondario che sia qualcosa a cui prestare attenzione se ti viene mai inviato un file CSV contenente indirizzi inglesi sia chiaro a tutti nonostante le mie divagazioni.
Scortchi - Ripristina Monica

1
in India, è comune per le persone che costruiscono le loro prime case (non appartamenti), mantenere un nome fiorito innovativo, spesso in una lingua vernacolare o frase sanscrita e quelle sono tra virgolette doppie, come "Guru Kripa". Anche nomi come Genelia D'Souza e Derek O'Brien sono comuni. Quindi, gli indirizzi che dicono "Vecchia porta nnn / Nuova porta n. Mm / c", a causa della rinumerazione del governo, complicano ulteriormente la memorizzazione degli indirizzi, per avere barre e virgolette singole negli angoli imprevisti.
Whirl Mind,

@WhirlMind: È interessante - ne ho notato un sacco - beh, più di quanto mi aspettassi - i nomi delle case gaelico scozzese e gallese in Inghilterra, che è forse l'equivalente più vicino a scegliere una lingua vernacolare in cui nominare la tua casa.
Scortchi - Ripristina Monica

9

Mentre la risposta di @Tim è corretta - vorrei aggiungere che "csv" nel suo insieme non ha standard comuni - in particolare le regole di escape non sono affatto definite, portando a "formati" che sono leggibili in un programma, ma non in un altro . Ciò è escluso dal fatto che ogni "programmatore" sotto il sole pensa semplicemente "oooh csv- costruirò il mio parser!" e poi manca tutti i casi limite.

Inoltre, CSV è totalmente privo della capacità di memorizzare i metadati o persino il tipo di dati di una colonna, il che porta a diversi documenti che è necessario leggere per mantenere i dati.


5
Sì, c'è tools.ietf.org/html/rfc4180 standard e molti altri formati non memorizzano alcun metadata, non è progettato per l'archiviazione di metadati - i file .txt non memorizzano anche metadati su documenti di testo ...
Tim

4
Tim, quello standard viene ignorato il più delle volte, rendendolo non standard ,,,
Christian Sauer,

8
La cosa grandiosa degli standard è che ce ne sono così tanti tra cui scegliere. (Diversamente mutato e attribuito.)
Nick Cox,

4

Se riesci ad abbandonare il delimitatore di virgola e utilizzare un carattere di tabulazione avrai un successo molto migliore. È possibile lasciare il file denominato .CSV e l'importazione nella maggior parte dei programmi non è in genere un problema. È sufficiente specificare delimitato da TAB anziché virgola quando si importa il file. Se ci sono virgole nei tuoi dati, avrai un problema quando specifichi una virgola delimitata come ben sai.


5
Se ci sono schede nei tuoi dati, si applica il contrario. È solo, almeno nella mia esperienza, meno probabile.
Nick Cox,

@ Nick e Gorilla: ho ottenuto buoni risultati |come delimitatore di file di testo di tipo CSV prodotti in casa (con titoli di libri e altri metadati di documenti). |non si verifica mai nei dati con cui lavoro, quindi posso semplicemente scrivere script perl che si suddividono / uniscono semplicemente senza cercare preventivi di alcun tipo. Questo era per un progetto unico che prevede solo l'elaborazione di metadati salvati da un database MS Access. Per qualsiasi progetto più grande o se prevedi di conservare i dati in questo formato di file a lungo termine, scegli qualcosa di più robusto! Potrei sempre modificare qualcosa se il batch di questo mese ha rotto qualcosa.
Peter Cordes,

@PeterCordes Ti credo, e qualunque cosa funzioni. Ma chiaramente il costo dei separatori idiosincratici potrebbe essere la necessità di spiegarli agli altri ed è fondamentale che possano importare tali file di dati senza difficoltà. Di fronte a un formato di file insolito, è necessario avere accesso ad alcune routine, funzioni o comandi che possono dividere le stringhe su separatori arbitrari.
Nick Cox,

@PeterCordes Quando ho scritto un splitcomando per Stata ho guardato, tra le altre cose, l'equivalente del Perl per vedere cosa faceva e non faceva. Non il codice sorgente, solo la funzionalità offerta.
Nick Cox,

1
@NickCox: molte funzioni di perl sono abbastanza ben progettate, IMO. Ottengono il lavoro fatto senza molte limitazioni speciali come quelle che trovi in ​​awk (che è spesso buono) o esp. altri strumenti Unix comecut , sorte uniq.
Peter Cordes,

4

ASCII ci fornisce quattro caratteri "separatori", come mostrato di seguito in uno snippet dalla pagina man ascii (7) * nix:

   Oct   Dec   Hex   Char
   ----------------------
   034   28    1C    FS  (file separator)
   035   29    1D    GS  (group separator)
   036   30    1E    RS  (record separator)
   037   31    1F    US  (unit separator)

Questa risposta fornisce una panoramica decente dell'uso previsto.

Naturalmente, questi codici di controllo mancano della facilità umana (leggibilità e input) dei delimitatori più popolari, ma sono scelte accettabili per lo scambio interno e / o effimero di dati tra programmi.


2
Interessante. Non credo di aver mai visto questi usati allo stato brado però ...
Matt Krause,

4

Il problema non è la virgola; il problema sta citando. Indipendentemente da quali delimitatori di record e di campo utilizzi, devi essere preparato per incontrarli nel contenuto. Quindi hai bisogno di un meccanismo di quotazione. E POI hai bisogno di un modo per far apparire anche il / i personaggio / i.

Seguire lo standard RFC 4180 rende tutto più semplice per tutti.

Ho dovuto scrivere personalmente uno script per correggere probabilmente l'output di un programma che ha sbagliato, quindi sono un po 'militante. "probabilmente correzione" significa che ha funzionato per i MIEI dati, ma posso vedere situazioni in cui fallirebbe. (A difesa di quel programma, è stato scritto prima dello standard.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.