2012-10-04 9 views
7

BenFputcsv tarafından kullanılan satır sonlarını nasıl değiştirebilirim?

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

kullanarak ve istemci tarafından indirilen bir CSV dosyasına veri yazmak için fputcsv() kullanarak istemci tarafından yüklenebilir bir CSV dosyası oluşturun.

Linux üzerinde PHP çalıştırıyorum ve sonuç olarak satır sonları birçok Windows uygulaması tarafından yorumlanmıyor.

sunucuda bir dizine CSV dosyası yazabilirsiniz, onu yeniden okumak ve \r\n için \n bir str_replace() gerçekleştirmek, ancak bu sorunu çözme oldukça aksak bir şekilde görünüyor. Fiziksel bir dosya oluşturmadan dönüştürme işlemini gerçekleştirmenin bir yolu var mı?

+0

kullanmaktır CRLF veya bazı oldukça eski Windows uygulamaları gerektiren bir Windows metin düzenleyicisi, o zaman gerçekten önemli olmamalı ... çoğu günümüzde uygulamaların yerine basit bir LF tanımak yerine –

+1

+1 için üzgünüm 1337'de olsaydınız, en zarif temsilcisi . Ama senin sorununun beni ilgilendiriyor, kaçış char'unu değiştirmenin de yolu yok ... –

+0

@MarkBaker: Evet, beklediğim buydu. Ne yazık ki, CSV'yi kullandıkları bazı MIS'lere aktarıyorlar, bu da Not Defteri'nden daha akıllı görünmüyor. – Kalessin

cevap

17

Sen akışı kullanabilirsiniz:;) gerçek çözümü gelince

yerine str_replace satır-satır, size yüklü olduğunu varsayarak Linux programını unix2dosdos2unix arasında (ters) de kullanabilir Bunu gerçekleştirmek için filtreler. Bu örnek fiziksel bir dosyaya yazar, ancak php://output için de iyi çalışmalıdır.

// 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

Bunu PHP'nin kendisiyle yapabileceğinizden emin değilsiniz. PHP'nin EOL'unu dosya yazmak için değiştirmenin bir yolu olabilir, ancak muhtemelen sisteme bağımlıdır. Ping yapabileceğin bir windows sisteminiz yok değil mi?

fputcsv($fh ...) 
exec("unix2dos " . escapeshellarg($filename)); 
1
  1. presto Hey Windows makinesinde
  2. -
  3. FTP Linux makinesinde Linux makineden ASCII dosyayı \ n satır sonları dosyası oluşturun! Tüm satır sonları şimdi \
-1

Aksine dosyayı yazmaktan daha Windows makinesinde dosyada r \ n, daha iyi bir çözüm kullanıcı dosyayı açıyor sürece çıkış tamponlama

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

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