Sfuggire correttamente a una doppia citazione in CSV


164

Ho una linea come questa nel mio CSV:

"Samsung U600 24"","10000003409","1","10000003427"

La virgoletta accanto 24viene utilizzata per esprimere i pollici, mentre la virgoletta accanto a quella virgoletta chiude il campo. Sto leggendo la riga con fgetcsvma il parser fa un errore e legge il valore come:

Samsung U600 24",10000003409"

Ho provato a mettere una barra rovesciata prima della citazione in pollici, ma poi ho solo una barra rovesciata nel nome:

Samsung U600 24\"

C'è un modo per sfuggire correttamente a questo nel CSV, in modo che il valore sia Samsung U600 24", o devo regex nel processore?


21
Raddoppia il tuo preventivo. Questo è tutto
Il tuo senso comune

Risposte:


282

Usa 2 citazioni:

"Samsung U600 24"""

102
RFC-4180, paragrafo "Se le virgolette doppie vengono utilizzate per racchiudere i campi, è necessario evitare una virgoletta doppia che appare all'interno di un campo precedendola con un'altra virgoletta doppia."
tommed

4
Come dice Tommy, devi solo aggiungere una virgoletta doppia per evitare una virgoletta doppia. È possibile utilizzare uno strumento da riga di comando chiamato csvfix per rilevare eventuali righe non conformi: csvfix check -nl -v [nome file]
Sam Critchley,

2
@SamCritchley Vedo solo una doppia citazione usata per scappare qui. Con "Usa 2 virgolette", user4035 significa che 1 virgoletta deve essere sostituita con 2 virgolette. Sfuggendo alle doppie virgolette con le doppie virgolette, stai effettivamente creando coppie di virgolette doppie (2 virgolette doppie). La citazione finale che vedi alla fine è di chiudere il campo.
Zenexer,

1
virgolette singole doppie doppie doppie doppie, ma solo se seguite da doppie doppie doppie virgolette ... buona fortuna!
Daniel Waltrip,

14

Non solo doppie virgolette, avrai bisogno di virgolette singole ( '), doppie virgolette ( "), barra rovesciata ( \) e NUL (il byte NULL).

Usa fputcsv()per scrivere e fgetcsv()leggere, che si occuperà di tutto.


3
Questo commento sulla pagina della documentazione difputcsv() mostra come è possibile utilizzare fputcsv()quando si desidera eseguire l'output in formato CSV sul browser anziché un file effettivo.
dennisschagt,

15
@Angelin Nadar, potresti per favore aggiungere una fonte alla tua richiesta sulla necessità di raddoppiare virgolette singole, barra rovesciata e NUL? Non l'ho trovato in RFC-4180 .
Petr 'PePa' Pavel,

2
In realtà non è necessario sfuggire alle virgolette singole, ecc. Un file CSV corretto non ha nemmeno bisogno di aggiungere virgolette doppie in un campo che contiene solo virgolette singole. Se il lettore CSV è implementato correttamente, dovrebbe leggere correttamente il file anche con quei simboli.
xji,

4
Perché questa risposta è mai stata votata? Il commento sui caratteri di escape non è mai stato eseguito il backup e la domanda originale non pone su PHP. Questo sembra essere vero solo per il delimitatore di stringa (e solo per il delimitatore scelto) quando un programma, come Open Office, consente di modificarlo.
Dave F,

0

So che questo è un vecchio post, ma ecco come l'ho risolto (insieme alla conversione di valori null in stringa vuota) in C # usando un metodo di estensione.

Crea una classe statica con qualcosa di simile al seguente:

    /// <summary>
    /// Wraps value in quotes if necessary and converts nulls to empty string
    /// </summary>
    /// <param name="value"></param>
    /// <returns>String ready for use in CSV output</returns>
    public static string Q(this string value)
    {
        if (value == null)
        {
            return string.Empty;
        }
        if (value.Contains(",") || (value.Contains("\"") || value.Contains("'") || value.Contains("\\"))
        {
            return "\"" + value + "\"";
        }
        return value;
    }

Quindi per ogni stringa che stai scrivendo in CSV, anziché:

stringBuilder.Append( WhateverVariable );

Fai solo:

stringBuilder.Append( WhateverVariable.Q() );

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.