2012-10-04 17 views
7

crea un file CSV per il download dal nostro cliente utilizzandoCome posso modificare le terminazioni di linea utilizzate da fputcsv?

$output = fopen('php://output', 'w'); 

e utilizzando fputcsv() per scrivere i dati in un file CSV che viene scaricato dal cliente.

Sto eseguendo PHP su Linux e di conseguenza le terminazioni di riga non sono interpretate da molte applicazioni Windows.

Potrei scrivere il file CSV in una directory sul server, leggere di nuovo in ed eseguire una str_replace()\n-\r\n, ma questo sembra un modo piuttosto goffo di risolvere il problema. C'è un modo per eseguire la conversione senza creare un file fisico?

+0

A meno che l'utente apre il file in un editor di testo di Windows che richiede CRLF, o alcune vecchie app di Windows, allora non dovrebbe davvero importare ... la maggior parte delle applicazioni Windows in questi giorni riconoscono un semplice LF invece –

+1

Scusa per +1 eri al 1337, il rappresentante più aggraziato . Ma la tua domanda mi interessa, non c'è modo di cambiare anche l'escape char ... –

+0

@MarkBaker: Sì, è quello che mi aspettavo. Sfortunatamente, stanno importando il CSV in un MIS che usano, il che non sembra essere più intelligente del Blocco note a questo riguardo. – Kalessin

risposta

17

si potrebbe usare flusso filtri per realizzare questo. Questo esempio scrive su un file fisico, ma dovrebbe funzionare anche per php://output.

// filter class that applies CRLF line endings 
class crlf_filter extends php_user_filter 
{ 
    function filter($in, $out, &$consumed, $closing) 
    { 
     while ($bucket = stream_bucket_make_writeable($in)) { 
      // make sure the line endings aren't already CRLF 
      $bucket->data = preg_replace("/(?<!\r)\n/", "\r\n", $bucket->data); 
      $consumed += $bucket->datalen; 
      stream_bucket_append($out, $bucket); 
     } 
     return PSFS_PASS_ON; 
    } 
} 
// register the filter 
stream_filter_register('crlf', 'crlf_filter'); 

$f = fopen('test.csv', 'wt'); 
// attach filter to output file 
stream_filter_append($f, 'crlf'); 
// start writing 
fputcsv($f, array('1 1', '2 2')); 
fclose($f); 
2

Non è sicuro se è possibile farlo con PHP stesso. Ci può essere un modo per cambiare la EOL di PHP per la scrittura di file, ma probabilmente dipende dal sistema. Non hai un sistema Windows per il ping, vero? ;)

Come per una vera soluzione, invece di str_replace linea per linea, è possibile utilizzare il programma Linux unix2dos (inverso del dos2unix) a patto di avere installato:

fputcsv($fh ...) 
exec("unix2dos " . escapeshellarg($filename)); 
1
  1. Creare il file con \ line n terminazioni su una macchina Linux
  2. FTP il file come ASCII dalla macchina Linux a una macchina Windows
  3. Hey Presto! Tutti i fine riga sono ora \ r \ n nel file sulla macchina Windows
-1

Invece di scrivere il file, una soluzione migliore è quella di utilizzare il buffering

function output($buffer) { 
    return str_replace("\r", "\r\n", $buffer); 
} 

ob_start('output'); 
fputcsv(....); 
Problemi correlati