Come faccio a sfuggire a virgole e contrassegni vocali nei file CSV in modo che funzionino in Excel?

Sto generando un file CSV (delimitato da virgole piuttosto che 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 del linguaggio, quindi sto evadendo quelli 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 il modo di farlo. Ecco il mio boggle: quando apro questo file in Excel 2010 la mia escaping non viene rispettata. I segni del discorso compaiono sul foglio e la virgola causa nuove colonne.

Alla fine abbiamo trovato la risposta a questo.

Excel rispetterà solo l’escaping di virgole e contrassegni vocali 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!

Di seguito sono elencate le regole se ritieni che sia casuale. Una funzione di utilità può essere creata sulla base di queste regole.

  1. Se il valore contiene una virgola, newline o virgolette doppie, il valore stringa deve essere restituito racchiuso tra virgolette.

  2. Ogni carattere di virgoletta nel valore dovrebbe essere sfuggito con un’altra virgoletta doppia.

  3. Se il valore non contiene una virgola, newline o double quote, il valore String dovrebbe essere restituito invariato.

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; 

Anche le virgolette singole funzionano bene, anche senza sfuggire alle doppie virgolette, 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 la virgoletta singola come “Qualificatore di testo” nella procedura guidata “Testo nelle colonne”)

Anche dopo le doppie virgolette, ho avuto questo problema per alcuni giorni.

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