output in formato CSV con '"' recinzioni

2013-06-06 15 views
7

voglio uscita una query in un file CSV con " recinzioni intorno tutti i campioutput in formato CSV con '"' recinzioni

la seguente:.

header('Content-Type: text/csv; charset=utf-8'); 
header('Content-Disposition: attachment; filename='.$strFeederFileName.''); 

$output = fopen('php://output', 'r+'); 
$fileheader = array("FH", "READY TO PAY", "RTP060620134", "060620134RWKN", ""); 
fputcsv($output, $fileheader, ",", '"'); 

Risulterà:

FH, "PRONTO A PAGARE", RTP060620134,060620134RWKN

ma Ho bisogno di essere:

"FH", "pronti a pagare", "RTP060620134", "060620134RWKN"

Tutte le idee perché non è l'aggiunta di allegati ai campi 1, 3 & 4?

+0

tale opzione in php ... ma vedi http: // stackoverflow.com/questions/2514597/php-fputcsv-and-enclosing-fields per darti un'implementazione alternativa. – Orangepill

+2

Non è necessario poiché non contiene caratteri come spazi bianchi, virgolette o caratteri di separazione. – Gumbo

risposta

1

fputcsv è abbastanza intelligente per indovinare quali colonne devono avere parentesi e non per mantenere valido il CSV.

Al momento sta emettendo CSV valido.

fputcsv non fornisce un'opzione per forzare l'inclusione tra virgolette, sarebbe probabilmente utile sapere perché è necessario che siano tutti tra virgolette?

+0

è un file feeder da importare in Oracle (che è molto specifico su quali campi si aspettano le virgolette). Suppongo che non sia un vero file CSV in quel caso, ma c'è qualche altra opzione? – Dion

0

Il commento di Gumby è corretto - se non ha bisogno di racchiudere tra virgolette, non lo farà. Potresti fare qualcosa come impostare il recinto su una stringa vuota e metterli su te stesso:

$fileheader = array("FH", "READY TO PAY", "RTP060620134", "060620134RWKN", ""); 
for($i=0; $i<count($fileheader); $i++) 
{ 
    $fileheader[i] = '"' . $fileheader[$i] . '"'; 
} 
fputcsv($output, $fileheader, ",", ''); 
0

Grazie a tutti per il vostro aiuto. Ho usato una combinazione di risposte perché dovevo essere in grado di scegliere quali campi racchiudere e quali no. Ho aggiunto una stringa univoca (xxx) intorno ai campi che io non voglio racchiudere e utilizzando str_replace prima di scrivere la riga al file:

header('Content-Type: text/csv; charset=utf-8'); 
header('Content-Disposition: attachment; filename='.$strFeederFileName.''); 

function dumbcsv($file_handle, $data_array, $enclosure, $field_sep, $record_sep) 
{ 
dumbescape(false, $enclosure); 
$data_array=array_map('dumbescape',$data_array); 

$line = $enclosure 
    . implode($enclosure . $field_sep . $enclosure, $data_array) 
    . $enclosure . $record_sep; 

$line = str_replace('"xxx', '', $line); 
$line = str_replace('xxx"', '', $line); 

return $line; 
} 

function dumbescape($in, $enclosure=false) 
    { 
    static $enc; 
    if ($enclosure===false) { 
    return str_replace($enc, '\\' . $enc, $in); 
    } 
    $enc=$enclosure; 
} 

$output = fopen('php://output', 'r+'); 
$rows_csv = mysql_query('SELECT * FROM tblfeeder'); 

//Add file header 
$fileheader = array("FH", "READY TO PAY", $fileheader, $strOracleBatchName); 
$line = dumbcsv($output, $fileheader, "\"", ",", "\r\n"); 
fwrite($output, $line); 

// loop over the rows, outputting them 
while ($row_csv = mysql_fetch_assoc($rows_csv)) fwrite($output, dumbcsv($output, $row_csv, "\"", ",", "\r\n")); 

//Add file footer 
$filefooter = array("IF", "xxx".$batchtotal."xxx", "xxx".$invnum."xxx"); 
$line = dumbcsv($output, $filefooter, "\"", ",", "\r\n"); 
fwrite($output, $line); 
Problemi correlati