2011-11-03 30 views
6

Tôi đang viết một hàm để xử lý đầu ra CSV bằng cách sử dụng fputcsv(). Tôi đã làm việc xung quanh vấn đề \r\n đáng sợ mà rất nhiều người đã có với fputcsv() (xem mã).Khi tạo tệp CSV, làm cách nào để xử lý n và r ký tự trong một trường?

Bây giờ tôi đang cố gắng tìm ra cách xử lý \r hoặc \n ký tự được bao gồm trong một trường (không phải dòng kết thúc trả về \r\n). Nó có nên được thoát bằng cách nào đó trước khi được chuyển vào fputcsv() không?

Chức năng xử lý thoát tốt cho hầu hết các ký tự. Tuy nhiên, khi một số \n được chèn vào một trường, cả MS Excel và Google Documents đều gặp sự cố với số \n và CSV không tải đúng.

/* 
* Revised Get CSV Line using PHP's fputcsv() 
* 
* Used to correct an issue with fputcsv() 
* http://stackoverflow.com/questions/4080456/fputcsv-and-newline-codes 
* MS Excel needs the MS Windows newline format of \r\n 
* 
*/ 

if (!function_exists('get_csv_line')) 
{ 
    function get_csv_line($list, $seperator = ",", $enclosure = '"', $newline = "\r\n") 
    { 
     $fp = fopen('php://temp', 'r+'); 

     fputcsv($fp, $list, $seperator, $enclosure); 
     rewind($fp); 

     $line = fgets($fp); 
     if ($newline && $newline != "\n") { 
      if ($line[strlen($line)-2] != "\r" && $line[strlen($line)-1] == "\n") { 
       $line = substr_replace($line,"",-1) . $newline; 
      } else { 
       die('original csv line is already \r\n style'); 
      } 
     } 
     if ($newline == "\r\n" && substr($line, -2) != "\r\n") { 
      log_message('error', 'function get_csv_line: Error, needs \r\n to be MS Excel friendly!'); 
     } 
     return $line; 
    } 
} 
+0

Tôi có nên thay thế \ n và \ r trong các trường có khoảng trống không? – jjwdesign

+3

Câu hỏi liên quan: [Tạo tệp CSV cho Excel, cách có một dòng mới bên trong một giá trị?] (Http://stackoverflow.com/questions/1241220/generating-csv-file-for-excel-how-to-have- a-newline-inside-a-value) – Anne

+0

Tôi đã làm việc trên một cái gì đó như thế này trước đây, CSV là một điều khủng khiếp để làm việc với, bạn thậm chí có thể phải đối mặt với các vấn đề như các lĩnh vực có chứa biểu tượng bao vây hoặc tách của bạn. Cuối cùng tôi phải chọn một số ký tự ngôn ngữ kỳ lạ cho những ký hiệu đó và chạy qua một tập lệnh dài để kiểm tra \ n \ r và đảm bảo có đủ ký tự bao vây và tách. –

Trả lời

3

Nếu có \ r hoặc \ n trong lĩnh vực này chỉ cần đảm bảo toàn bộ lĩnh vực được bao bọc bởi dấu ngoặc kép (và dấu ngoặc kép đen là trích dẫn đúp kép)

Vì vậy, cho một kết quả cuối cùng của

value1,"so this is a 
multiline value",value2 

nơi 'a' và 'multiline' được tách ra bởi hoặc là một \ n hoặc \ r (hãy nhớ, \ r sẽ không hiển thị trên excel, nhưng nó ở đó), sau đó nó nên đã làm việc.

Nếu giá trị \ n hoặc \ r được nhúng trong giá trị bạn có trong mảng PHP, thì nó phải được đính kèm một cách thích hợp.

0

Tệp UTF chứa BOM sẽ khiến Excel xử lý các dòng mới theo nghĩa đen ngay cả trong trường đó được bao quanh bởi dấu ngoặc kép. (Thử nghiệm Excel 2008 Mac)

Giải pháp là làm cho bất kỳ dòng mới nào trở về vận chuyển (CHR 13) chứ không phải là nguồn cấp dữ liệu dòng.

Các vấn đề liên quan