2013-07-23 6 views
87

Ho una linea come questo nel mio CSV:correttamente sfuggire a una doppia citazione in formato CSV

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

Citazione accanto al 24 viene utilizzato per esprimere pollici, mentre la citazione proprio accanto a quella citazione chiude il campo . Sto leggendo la linea con fgetcsv ma il parser fa un errore e legge il valore come:

Samsung U600 24",10000003409"

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

Samsung U600 24\"

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

+15

Basta raddoppiare la tua offerta. Questo è tutto –

risposta

157

Usa 2 citazioni:

"Samsung U600 24""" 
+47

RFC-4180, paragrafo "Se le doppie virgolette sono usate per racchiudere i campi, allora una virgola doppia che appare all'interno di un campo deve essere preceduta da una doppia virgoletta doppia con un'altra virgoletta doppia." – tommed

+1

Come tommed dice che è sufficiente aggiungere una virgola doppia per evitare una virgoletta doppia. Puoi usare uno strumento da riga di comando chiamato csvfix per rilevare qualsiasi linea che non è conforme: csvfix check -nl -v [nomefile] –

+1

@SamCritchley Vedo solo una singola virgola doppia usata per scappare qui. Con "Usa 2 virgolette", user4035 significa che 1 virgoletta deve essere sostituita con 2 virgolette. Sfuggendo alle virgolette doppie con virgolette doppie, si creano effettivamente coppie di virgolette doppie (2 virgolette doppie). L'ultima citazione che vedi alla fine è di terminare il campo. – Zenexer

18

Non solo i doppi apici, si sarà in necessità di singola citazione ('), doppie virgolette ("), barra rovesciata (\) e NUL (il byte NULL).

Utilizzare fputcsv() per scrivere e fgetcsv() da leggere, che si occuperà di tutti.

+3

[Questo commento] (http://php.net/manual/en/function.fputcsv.php#104980) su [la pagina di documentazione di 'fputcsv()'] (http://php.net/manual/en /function.fputcsv.php) mostra come si può usare 'fputcsv()' quando si vuole produrre in formato csv sul browser invece di un file reale. – dennisschagt

+9

@Angelin Nadar, potresti aggiungere una fonte alla tua affermazione sulla necessità di raddoppiare la citazione singola, il backslash e la NUL? Non l'ho trovato in [RFC-4180] (https://tools.ietf.org/html/rfc4180). –

+0

Non è necessario sfuggire effettivamente a virgolette singole, ecc. Un file CSV appropriato non ha nemmeno bisogno di aggiungere virgolette doppie attorno a un campo che contiene solo virgolette singole. Se il lettore CSV è implementato correttamente dovrebbe leggere il file correttamente anche con quei simboli. –