2011-01-19 12 views
12

consideri s CSV come questoil file Come fare il parsing CSV in PHP disporre di dati su più righe in una colonna

item1,"description 1" 
item2,"description 2" 
item3,"description 3 
description 3 continues on new line" 
item4,"description 4" 

che dovrebbe essere analizzato come questo

item1,"description 1" 
item2,"description 2" 
item3,"description 3 description 3 continues on new line" 
item4,"description 4" 

C'è un modo per analizzare questo CSV in PHP che ha valori multilinea?

+0

Scrivere un parser? –

+0

@goreSplatter, o semplicemente usa uno esistente. –

+0

@Bart Mi dispiace di aver omesso l'altra ovvia soluzione. –

risposta

8

fgetcsv dovrebbe essere in grado di analizzare correttamente questo.
Non consiglierei di farlo comunque a mano, ci sono molti trucchi nell'analisi del CSV.

+2

Il problema è che stavo usando fgets leggere la riga dal file quindi str_getcsv per analizzare la stringa invece di usando solo fgetcsv. Funzionava bene con colonne a riga singola ma non su più righe. Persino PHP.net dice che fgetcsv "Ottiene la linea dal file" sembra che "linea" qui non sia una riga reale nel file di testo normale ma l'intera riga reale con tutti i dati multilinea. – Ergec

+0

Oggi sono arrivato allo stesso problema e ho fatto un piccolo [test] (http://phpfiddle.org/main/code/rd6-new), che dimostra la tua affermazione su _lines_ che si riferisce a _csv-rows_ e non a _file- effettivo Linee_. – Raoul

8

Ecco alcuni esempi di lavoro su come farlo. Sto usando fgetcsv:

CSV nella stringa $ CsvString variabile:

$fp = tmpfile(); 
fwrite($fp, $CsvString); 
rewind($fp); //rewind to process CSV 
while (($row = fgetcsv($fp, 0)) !== FALSE) { 
    print_r($row); 
} 

CSV nel file:

if (($handle = fopen("test.csv", "r")) !== FALSE) { 
    while (($row = fgetcsv($handle, 0, ",")) !== FALSE) { 
    print_r($row); 
    } 
    fclose($handle); 
} 
+0

Ottima risposta. Ho CSV caricati dall'utente con terminazioni di riga (non ho idea del perché), e ho dovuto strreplace prima di analizzare CSV. Poiché str_getcsv non gestisce più righe, e alcune righe hanno nuove linee in esse, questo (mentre hackish, mettendo cose in un file temporaneo solo per farle analizzare PHP) funziona. – csga5000

6

Sulla base di StanleyD risposta, ma utilizzando un blocco di memoria temporanea (piuttosto che scrivere a disco) per prestazioni migliori:

$fp = fopen('php://temp','r+'); 
fwrite($fp, $CsvString); 
rewind($fp); //rewind to process CSV 
while (($row = fgetcsv($fp, 0)) !== FALSE) { 
    print_r($row); 
} 
Problemi correlati