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


283

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é viene interpretato come una nuova colonna.

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

Vorrei davvero mantenere il separatore di virgola (so che Excel supporta altri delimitatori ma altri interpreti potrebbero non farlo). Vorrei anche mantenere la virgola nel nome, poiché Joe Blow| CFAsembra piuttosto sciocco.

Esiste un modo per includere le virgole nelle colonne CSV senza interrompere la formattazione, ad esempio salvandole?



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,

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

Risposte:


373

Racchiudere il campo tra virgolette, ad es

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

Vedi Wikipedia .

Aggiornato :

Per codificare una citazione, utilizzare ", un doppio simbolo di virgoletta in un campo verrà codificato come ""e l'intero campo diventerà """". Quindi, se vedi quanto segue in es. Excel:

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

il file CSV conterrà:

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

Una virgola viene semplicemente incapsulata usando le virgolette, quindi ,diventa ",".

Una virgola e una citazione devono essere incapsulate e citate, così ","diventa """,""".


4
Questo ha funzionato per me! Stavo esportando una variabile js in CSV e inserendo una coppia di virgolette attorno a ogni stringa, ho aiutato a risolvere il problema di "John Blow, CFA", come menzionato nella domanda.
Madhulika Mukherjee,

Cosa succede se all'interno di ogni cella sono presenti sia virgole che virgole?
speedplane il

2
Ho aggiornato la risposta con alcuni esempi - in breve, le virgole sono incapsulate tra virgolette (come ",") e le virgolette sono sfuggite (ad esempio """)
Ryan

6
Ora QUESTA dovrebbe essere la risposta accettata in quanto propone un'ottima soluzione che probabilmente risolve il 99% dei casi d'uso.
BuZz,

Esiste una libreria C # per analizzare i file CSV con campi con virgolette?
Minh Tran,

34

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

Documento di specifica di riferimento .


10
RFC 4180, formato comune e tipo MIME per file CSV (Comma-Separated Values), ietf.org/rfc/rfc4180.txt ; un'ulteriore specifica "ufficiale".
Shi,

3
Includere l'approccio più ampiamente accettato renderebbe questa un'ottima risposta. Allo stato attuale, la risposta di @Ryan vince.
Rinogo,

16

Se vuoi fare ciò che hai detto, puoi usare le virgolette. Qualcosa come questo

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

quindi ora puoi usare la virgola nella variabile del tuo nome.


Grazie Cloud per il suggerimento, è stato così: $whatever = "\"".$name."\"";
Washere

Grazie per la tua soluzione.
Bhavin Thummar,

10

Devi citare quei valori.
Ecco una specifica più dettagliata.


2
Esistono più specifiche, Excel utilizza le virgolette intorno alla voce, Linux utilizza il carattere barra rovesciata. Sfortunatamente, devi scappare per il tuo pubblico / sistema target previsto.
Rudu,

7

Oltre ai punti in altre risposte: una cosa da notare se si utilizzano le virgolette in Excel è il posizionamento dei tuoi spazi. Se hai una riga di codice come questa:

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

Excel considererà la citazione iniziale come una citazione letterale invece di usarla per sfuggire alle virgole. Il tuo codice dovrà cambiare in

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

È stata questa sottigliezza che mi ha portato qui.


3

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


2
E cosa avresti fatto se i dati contenessero caratteri "+"?
Andrew Morton,

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

4
Il modo semplice e robusto è racchiudere le stringhe tra virgolette doppie e sfuggire alle virgolette doppie nelle stringhe usando due di esse come "". Questo è il modo normale di farlo.
Andrew Morton,

1
Se non funziona, verifica che non stai generando spazi accanto alle virgole di delimitazione: "Rana", "giallo, verde" funzionerà "Rana", "giallo, verde" non funzionerà
Dazbert

Personalmente ho trovato il secondo commento di @AndrewMorton qui in realtà mi ha aiutato a capire cosa fare meglio della risposta accettata. Passaggio 1: sfuggire alle doppie virgolette nei campi di dati, ad esempio in Python: field = field.replace('"', '""')Passaggio 2: dopo il passaggio 1, racchiudere il campo stesso tra virgolette doppie, ad esempio field = '"' + field + '"', quindi si è iron-cast, credo.
Will Croxford il

3

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


3

Ho scoperto che alcune applicazioni come Numbers in Mac ignorano la doppia citazione se c'è spazio prima.

a, "b,c"non funziona mentre a,"b,c"funziona.


1
Probabilmente mi hai appena risparmiato un'ora di lavoro ... grazie!
Shaun314,



0

È possibile utilizzare il Text_Qualifiercampo nella gestione connessione file flat per as ". Questo dovrebbe racchiudere i tuoi dati tra virgolette e separati solo da virgole che sono al di fuori delle virgolette.


0

Innanzitutto, se il valore dell'articolo ha il carattere di virgoletta doppia ("), sostituiscilo con 2 caratteri di virgoletta doppia (" ")

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

Infine, avvolgi il valore dell'articolo:

A SINISTRA: con virgolette doppie (")

A DESTRA: con virgolette doppie (") e virgole (,)

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

0

Le doppie virgolette non hanno funzionato per me, hanno funzionato per me \". Se si desidera inserire virgolette doppie come esempio, è possibile impostare \"\".

Puoi creare formule, ad esempio:

fprintf(strout, "\"=if(C3=1,\"\"\"\",B3)\"\n");

scriverò in csv:

= SE (C3 = 1, "", B3)


0

Potrebbe non essere quello che serve qui, ma è una domanda molto vecchia e la risposta può aiutare gli altri. Un consiglio che trovo utile con l'importazione in Excel con un separatore diverso è quello di aprire il file in un editor di testo e aggiungere una prima riga come:

Settembre = |

dove | è il separatore che desideri venga utilizzato da Excel. In alternativa puoi cambiare il separatore predefinito in Windows ma un po 'prolisso:

Pannello di controllo> Orologio e regione> Regione> Formati> Ulteriori> Numeri> Separatore elenco [cambia dalla virgola all'alternativa preferita]. Ciò significa che Excel eseguirà automaticamente anche l'esportazione di CSV utilizzando il separatore scelto.

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.