Come devo evitare le virgole e i segni di discorso nei file CSV in modo che funzionino in Excel?


111

Sto generando un file CSV (delimitato da virgole anziché da tabulazioni). Molto probabilmente i miei utenti apriranno il file CSV in Excel facendo doppio clic su di esso. I miei dati possono contenere virgole e segni di discorso, quindi eseguo l'escape come segue.

Reference, Title, Description
1, "My little title", "My description, which may contain ""speech marks"" and commas."
2, "My other little title", "My other description, which may also contain ""speech marks"" and commas."

Per quanto ne so, è sempre stato così. Ecco il mio boggle: quando apro questo file in Excel 2010 la mia fuga non viene rispettata. I segni di discorso vengono visualizzati sul foglio e la virgola crea nuove colonne.

Risposte:


219

Alla fine abbiamo trovato la risposta a questo.

Excel rispetterà solo l'escape di virgole e segni di discorso se il valore della colonna NON è preceduto da uno spazio. Quindi generare il file senza spazi come questo ...

Reference,Title,Description
1,"My little title","My description, which may contain ""speech marks"" and commas."
2,"My other little title","My other description, which may also contain ""speech marks"" and commas."

... risolto il problema. Spero che questo aiuti qualcuno!


2
Questo è un problema in cui mi sono imbattuto in passato e me ne dimentico sempre. Excel dovrebbe interrompere questo comportamento, poiché crea semplicemente confusione e non è una regola utile da avere in primo luogo. Quello o CSV non dovrebbero avere obbligatoriamente spazi bianchi tra virgole.
Jacques Mathieu

61

Di seguito sono riportate le regole se ritieni che sia casuale. Sulla base di queste regole è possibile creare una funzione di utilità.

  1. Se il valore contiene una virgola, una nuova riga o virgolette doppie, il valore String deve essere restituito racchiuso tra virgolette doppie.

  2. Eventuali caratteri di virgolette doppie nel valore devono essere preceduti da un'altra virgoletta doppia.

  3. Se il valore non contiene una virgola, una nuova riga o virgolette doppie, il valore String deve essere restituito invariato.


4
Fa male a qualcosa racchiudere tra virgolette qualcosa che non ha virgole, virgolette doppie o nuove righe?
Erik Reppen

2
No ErikReppen Non penso che farebbe male normalmente. Appartengo a uno sfondo java in cui è consigliabile non creare nuove stringhe sostituendo il testo in quelle vecchie poiché hanno la loro condivisione all'interno della memoria heap. Se lo desideri, puoi sostituire incondizionatamente tutti i valori e dirci se causa problemi anche se non dovrebbe.
AlphaBetaGamma

2
Un campo che inizia o finisce con uno spazio dovrebbe essere citato.
Jonathan Rosenne

2

Secondo le istruzioni di Yashu, ho scritto la seguente funzione (è codice PL / SQL, ma dovrebbe essere facilmente adattabile a qualsiasi altra lingua).

FUNCTION field(str IN VARCHAR2) RETURN VARCHAR2 IS
    C_NEWLINE CONSTANT CHAR(1) := '
'; -- newline is intentional

    v_aux VARCHAR2(32000);
    v_has_double_quotes BOOLEAN;
    v_has_comma BOOLEAN;
    v_has_newline BOOLEAN;
BEGIN
    v_has_double_quotes := instr(str, '"') > 0;
    v_has_comma := instr(str,',') > 0;
    v_has_newline := instr(str, C_NEWLINE) > 0;

    IF v_has_double_quotes OR v_has_comma OR v_has_newline THEN
        IF v_has_double_quotes THEN
            v_aux := replace(str,'"','""');
        ELSE
            v_aux := str;
        END IF;
        return '"'||v_aux||'"';
    ELSE
        return str;
    END IF;
END;

0

Anche le virgolette singole funzionano bene, anche senza sfuggire alle virgolette doppie, almeno in Excel 2016:

'text with spaces, and a comma','more text with spaces','spaces and "quoted text" and more spaces','nospaces','NOSPACES1234'

Excel lo inserirà in 5 colonne (se scegli le virgolette singole come "Qualificatore di testo" nella procedura guidata "Da testo a colonne")


-3

Anche dopo i doppi apici, ho avuto questo problema per alcuni giorni.

Sostituito il delimitatore di tubo con virgola, quindi le cose hanno funzionato bene.


1
Dovresti fornire un esempio di ciò che ha funzionato per te in modo che l'OP possa copiarlo e incollarlo se necessario.
Reuben Tanner
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.