2012-10-04 13 views
7

utworzyć plik CSV do pobrania przez klienta przy użyciuJak mogę zmienić zakończenia linii używane przez fputcsv?

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

i używając fputcsv() do zapisu danych do pliku CSV, który jest pobierany przez klienta.

Używam PHP w systemie Linux, w związku z czym zakończenia linii nie są interpretowane przez wiele aplikacji systemu Windows.

mógłbym napisać plik CSV do katalogu na serwerze, odczytać go z powrotem i wykonać str_replace() z \n do \r\n, ale to wydaje się raczej przylegający sposób rozwiązania problemu. Czy istnieje sposób przeprowadzenia konwersji bez tworzenia fizycznego pliku?

+0

Jeżeli użytkownik otwiera plik w edytor tekstu Windows, który wymaga CRLF lub całkiem starych aplikacji Windows, to nie powinno mieć znaczenia ... większość aplikacji Windows w dzisiejszych czasach rozpoznaje prosty LF zamiast tego: –

+1

Przepraszamy za +1 jesteś w 1337, najbardziej wdzięczny przedstawiciel . Ale twoje pytanie mnie interesuje, nie ma mowy o zmianie znaku escape też ... –

+0

@MarkBaker: Tak, tego się spodziewałem. Niestety, importują CSV do niektórych MIS, z których korzystają, co nie wydaje się być mądrzejsze od Notatnika w tym zakresie. – Kalessin

Odpowiedz

17

Można użyć strumienia filtry do tego celu. Ten przykład zapisuje do fizycznego pliku, ale powinien również działać poprawnie dla 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

Nie jestem pewien, czy możesz to zrobić z samym PHP. Być może istnieje sposób na zmianę EOL PHP do zapisu plików, ale prawdopodobnie zależy to od systemu. Nie masz systemu Windows, który mógłbyś pingować, prawda? ;)

Jak na prawdziwego rozwiązania, zamiast str_replace linia po linii, można użyć programu Linux unix2dos (odwrotność dos2unix) zakładając, że masz go zainstalowanego:

fputcsv($fh ...) 
exec("unix2dos " . escapeshellarg($filename)); 
1
  1. Utwórz plik \ n zakończeń linii na maszynie Linux
  2. FTP plik jako ASCII z maszyny Linux na komputerze Windows
  3. Hej presto! Wszystkie zakończenia linii są teraz \ r \ n w pliku na komputerze z systemem Windows
-1

Zamiast zapisu pliku, lepszym rozwiązaniem jest użycie buforowanie

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

ob_start('output'); 
fputcsv(....); 
Powiązane problemy