2012-10-04 29 views
7

tôi có thể tạo một tập tin CSV để tải bởi khách hàng của chúng tôi sử dụngLàm cách nào để thay đổi kết thúc dòng được fputcsv sử dụng?

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

và sử dụng fputcsv() để ghi dữ liệu vào một tập tin CSV mà sẽ được tải về bởi máy khách.

Tôi đang chạy PHP trên Linux và do đó kết thúc dòng không được giải thích bởi nhiều ứng dụng Windows.

Tôi có thể ghi tệp CSV vào thư mục trên máy chủ, đọc lại và thực hiện str_replace() từ \n đến \r\n, nhưng điều này có vẻ là một cách giải quyết vấn đề. Có cách nào để thực hiện chuyển đổi mà không cần tạo tệp vật lý không?

+0

Trừ khi người dùng mở tập tin trong một trình soạn thảo văn bản Windows yêu cầu CRLF, hoặc một số ứng dụng Windows khá cũ, sau đó nó không thực sự quan trọng ... hầu hết các ứng dụng Windows ngày nay nhận ra một LF đơn giản thay vì –

+1

Xin lỗi cho +1 bạn đã ở 1337, đại diện duyên dáng nhất . Nhưng câu hỏi của bạn quan tâm đến tôi, không có cách nào để thay đổi lối thoát hiểm ... –

+0

@MarkBaker: Vâng, đó là những gì tôi mong đợi. Thật không may, họ đang nhập CSV vào một số MIS mà họ sử dụng, điều này dường như không thông minh hơn Notepad trong vấn đề này. – Kalessin

Trả lời

17

Bạn có thể sử dụng dòng bộ lọc để thực hiện việc này. Ví dụ này ghi vào một tệp vật lý, nhưng nó cũng hoạt động tốt cho 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

Không chắc chắn liệu bạn có thể thực hiện điều này bằng chính PHP hay không. Có thể có một cách để thay đổi EOL của PHP để viết tệp, nhưng có lẽ nó phụ thuộc vào hệ thống. Bạn không có hệ thống cửa sổ bạn có thể ping, phải không? ;)

Đối với một giải pháp thực tế, thay vì str_replace line-by-line, bạn có thể sử dụng chương trình Linux unix2dos (nghịch đảo của dos2unix) giả sử bạn đã cài đặt:

fputcsv($fh ...) 
exec("unix2dos " . escapeshellarg($filename)); 
1
  1. Tạo tập tin với \ n dòng kết thúc trên một máy Linux
  2. FTP nội dung tập tin ASCII từ máy Linux vào một máy tính Windows
  3. Hey mau! Tất cả kết thúc dòng bây giờ \ r \ n trong file trên máy tính Windows
-1

Thay vì viết các tập tin, một giải pháp tốt hơn là sử dụng đầu ra đệm

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

ob_start('output'); 
fputcsv(....); 
Các vấn đề liên quan