2009-04-21 2 views
5

MODIFICA: la parte errata della funzione copiata in questa domanda è la seguente.È necessario esportare correttamente stringa w/virgole in un file CSV

$values = mysql_query("SELECT lname, fname, email, dtelephone, etelephone, contactwhen, thursday, 
friday, saturday, sunday, monday, comments FROM volunteers_2009 WHERE venue_id = $venue_id"); 

while ($rowr = mysql_fetch_row($values)) { 
    for ($j=0;$j<$i;$j++) { 
     $csv_output .= $rowr[$j].", "; 
    } 
    $csv_output .= "\n"; 
} 

devo commenti che possono avere una virgola in esso, e citazioni anche doppi, quando ha una virgola nel campo commento, getta via l'intero file CSV.

Il codice seguente mostra come carica i dati nella stringa csv, da inserire in un file csv.

Come ottengo esportare correttamente i dati del campo commenti?

risposta

6

Racchiudere il campo tra virgolette. Raddoppia le doppie virgolette incorporate.

ordinary field,"field with , in it","field with double double quote ("""")" 

Si noti che questo è molto, molto vicino alla domanda Dealing with commas in a CSV file

+0

Bene, questo è più specifico della lingua (penso che la risposta scelta per quella domanda sia stata scritta in C o C++?). sshow ha fornito una soluzione php specifica molto buona che non è stata fornita nell'altra domanda. – Calvin

+0

Ecco perché ho detto "vicino all'altra domanda" e non "chiudi - perché duplicati esatti" (ed è divertente, ma quelle due parole "chiudi" sono pronunciate in modo diverso nel mio dialetto dell'inglese, la prima ha una sibilante acuta il secondo suono z a voce). –

+1

Inoltre, la risposta alla domanda x-ref fornisce le informazioni algoritmiche necessarie per produrre il codice per risolvere questo (o per valutare la qualità dell'output dalle soluzioni proposte). –

0

Modifica: Il mio male, l'ho appena testato e non funziona, non in Excel almeno.

È possibile sostituire le virgole con qualcos'altro, però:

$field = str_replace(',','#COMMA#',$row['Field']); 
$csv_output .= $field.', '; 
0

si potrebbe usare un delimitatore diverso, come "|" o "@" o qualche altro carattere che non è probabile che appaia nei dati.

La maggior parte del software csv ha la capacità di leggere in un file "csv" che utilizza qualcosa di diverso da una virgola come delimitatore.

+0

@ potrebbe non essere un buon esempio, poiché sarà incluso nell'indirizzo email ... ma questo è solo un esempio. –

10

Si dovrebbe verificare fputcsv(). Ci sono anche alcuni commenti utili.

int fputcsv (resource $handle , array $fields [, string $delimiter = ',' 
    [, string $enclosure = '"' ]]) 

fputcsv() formatta una linea (passato come array campi) come CSV e scriverlo (terminato da una nuova riga) per l'handle file specificato.

1

Umn, perché non utilizzare semplicemente il comando mySQL incorporato? Se ho perso qualcosa, si prega di ignorarlo, ma penso che questo sia il percorso più veloce:

http://www.netreveal.com/ddalton/2006/08/how_to_export_mysql_to_csv.html

Sito suggerisce fondamentalmente:

SELECT <fields or *> INTO OUTFILE '/tmp/result.text' 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
FROM <table> WHERE <condition> 
0

E 'importante mantenere il virgole e virgolette doppie nei dati quando lo esporti? È sempre possibile leggerlo e quindi modificare i dati prima di esportarlo nel CSV.

Quello che faccio in genere è racchiudere tutto tra virgolette e creare la combinazione di "," (virgola doppia virgola doppia virgola) delimitatore. In questo modo se incappo in una doppia citazione casuale o in una virgola casuale, non è un grosso problema.