2011-01-06 9 views
94

Ho un CSV a due colonne con un nome e un numero. Il nome di alcune persone usa le virgole, ad esempio Joe Blow, CFA. Questa virgola rompe il formato CSV, poiché è interpretata come una nuova colonna.C'è un modo per includere le virgole nelle colonne CSV senza interrompere la formattazione?

Ho letto e la prescrizione più comune sembra sostituire quel carattere o sostituire il delimitatore con un nuovo valore (ad esempio this|that|the, other).

Mi piacerebbe molto mantenere il separatore di virgola (so che Excel supporta altri delimitatori ma altri interpreti potrebbero non farlo). Mi piacerebbe anche mantenere la virgola nel nome, come Joe Blow| CFA sembra piuttosto stupido.

C'è un modo per includere le virgole nelle colonne CSV senza interrompere la formattazione, ad esempio evadendole?

+0

Possibile duplicato di [Gestione delle virgole in un file CSV] (http://stackoverflow.com/questions/769621/dealing-with-commas-in-a-csv-file) –

+0

Piccolo hack che ha funzionato per me: apri il file csv in un editor di testo, quindi incollalo in un documento excel. Funziona se puoi farlo in grossi pezzi. – Jonas

+0

@Jonas: Excel non può indovinare se lo stesso token viene utilizzato come delimitatore o parte dei dati. Incollare da un editor di testo non lo cambia. – IInspectable

risposta

21

Il problema con il formato CSV, non c'è una specifica, ci sono diversi metodi accettati, senza alcun modo di distinguere che dovrebbero essere usati (per generare/interpretare). Ho discusso tutti i metodi per sfuggire ai personaggi (newline in quel caso, ma la stessa premessa di base) in another post. Fondamentalmente si tratta di utilizzare un processo di generazione/escape CSV per gli utenti previsti, e sperando che il resto non importi.

Reference spec document.

+2

RFC 4180, Formato comune e Tipo MIME per Virgola -Separated Values ​​(CSV) Files, https://www.ietf.org/rfc/rfc4180.txt; un'altra specifica "ufficiale" – Shi

8

È necessario citare tali valori.
Here è una specifica più dettagliata.

+2

Ci sono più specifiche, Excel usa citazioni attorno alla voce, Linux usa il carattere barra rovesciata. Sfortunatamente, devi fuggire per il tuo pubblico target/sistema di destinazione. – Rudu

90

Racchiudere il campo tra virgolette, ad es.

field1_value,field2_value,"field 3,value",field4, etc... 

Vedere wikipedia.

Aggiornato:

Per codificare una citazione, utilizzare ", un unico simbolo citazione in un campo sarà codificato come "", e tutto il campo diventerà """". Quindi se vedi il seguente, ad es. Excel:

--------------------------------------- 
| regular_value |,,,"| ,"", |""" |"| 
--------------------------------------- 

il file CSV conterrà:

regular_value,",,,""",","""",","""""""","""" 

Una virgola è semplicemente incapsulato usando le virgolette, in modo , diventa ",".

Un comando e un preventivo devono essere incapsulati e citati, quindi "," diventa """,""".

+2

Questo ha funzionato per me! Stavo esportando una variabile js in CSV e inserendo un paio di virgolette in più su ogni stringa, ho aiutato a risolvere il problema di "John Blow, CFA", come menzionato nella domanda. –

+0

Cosa succede se ci sono sia virgolette che virgole all'interno di ogni cella? – speedplane

+0

Ho aggiornato la risposta con alcuni esempi: in breve, le virgole sono racchiuse tra virgolette (come '", "') e le virgolette sono sfuggite (ad es. "" "" ') – Ryan

0

È possibile utilizzare il campo Text_Qualifier nella Gestione connessione file flat come ". Questo dovrebbe includere i dati in virgolette e separarli solo da virgole che non rientrano tra virgolette.

6

Oltre ai punti in altre risposte: una cosa da notare se si utilizzano le virgolette in Excel è il posizionamento dei propri spazi.Se si dispone di una linea di codice come questo:

print '%s, "%s", "%s", "%s"' % (value_1, value_2, value_3, value_4) 

Excel tratterà la citazione iniziale come una citazione letterale invece di usarlo per sfuggire le virgole. Il tuo codice dovrà cambiare in

print '%s,"%s","%s","%s"' % (value_1, value_2, value_3, value_4) 

Era questa sottigliezza che mi ha portato qui.

6

Se vuoi farlo, hai usato le virgolette. Qualcosa di simile

$name = "Joe Blow, CFA."; 
$arr[] = "\"".$name."\""; 

così ora, è possibile utilizzare la virgola nella variabile nome.

+0

Grazie Cloud per il tuo suggerimento, che l'ha fatto: '$ whatever =" \ "". $ name. "\" ";' – washere

1

Ho affrontato lo stesso problema e citando il , non ha aiutato. Alla fine, ho sostituito lo + con +, completato l'elaborazione, salvato l'output in un file di uscita e sostituito lo + con ,. Questo può sembrare brutto ma ha funzionato per me.

+1

E cosa avresti fatto se i dati contenessero caratteri "+"? –

+1

@AndrewMorton Sì, questa è una sfida, ma nel mio caso sono sicuro che '+' non esiste affatto nei miei dati Grazie per il gentile commento – Mohammed

+2

Il modo semplice e robusto è racchiudere le stringhe tra virgolette e sfuggire le virgolette all'interno di stringhe usando due di esse come "" "'. il modo normale di farlo. –

0

In primo luogo, se il valore oggetto ha carattere virgolette ("), sostituire con 2 carattere di citazione doppio (" ")

item = item.ToString().Replace("""", """""") 

Infine, avvolgere il valore dell'articolo:

a sinistra: Con virgolette carattere (")

A destra: Con carattere preventivo doppia (") e il carattere virgola (,)

csv += """" & item.ToString() & """," 
0

A seconda della lingua, potrebbe essere disponibile un metodo to_son. Ciò sfuggirà a molte cose che rompono i CSV.

Problemi correlati