2010-04-30 31 views
12

Tôi có một kịch bản mà tạo ra một tập tin csv sử dụng đoạn mã sau:PHP tạo csv không gửi dòng mới đúng feeds

header('Content-type: text/csv'); 
header('Content-Disposition: attachment; filename="'.date("Ymdhis").'.csv"'); 
print $content; 

Biến nội dung $ đơn giản chứa dòng với các lĩnh vực được phân cách bởi dấu phẩy và sau đó hoàn thành với. "\ n"; để tạo một dòng mới.

Khi tôi mở tệp bằng csv, tuy nhiên, khi tôi cố gắng sử dụng tệp để nhập vào chương trình bên ngoài (MYOB), nó không nhận dạng ký tự Cuối dòng (\ n) và giả định một dòng dài của văn bản.

Khi tôi xem nội dung của tệp trong notepad, ký tự cuối dòng (\ n) là một hộp hình chữ nhật nhỏ trông giống như mã ký tự 0x7F.

Nếu tôi mở tệp và lưu lại tệp thành excel, nó sẽ xóa ký tự này và thay thế bằng ký tự dòng thích hợp và tôi có thể nhập tệp.

Tôi cần tạo ký tự nào trong PHP để notepad nhận ra đó là ký tự End Of Line hợp lệ? (\ n) rõ ràng là không thực hiện công việc.

Trả lời

20

Sử dụng "\ r \ n". (với dấu ngoặc kép)

Ở trên là các ký tự ascii cho dòng trả lại dòng + dòng.

Về mặt lịch sử, điều này liên quan đến những ngày đầu tính toán trên các loại máy in khi đầu ra được in ra giấy và trả lại đầu của đầu teletype vào đầu dòng là một hoạt động riêng biệt để cho ăn một đường qua máy in. Bạn có thể ghi đè lên các dòng bằng cách chỉ thực hiện trả lại dòng và chèn các dòng trống bằng một nguồn cấp dữ liệu dòng. Làm cả hai trả lại đầu đến đầu dòng và cho nó một dòng mới để in trên.

Chính xác những gì được yêu cầu khác nhau giữa các hệ thống -

  • thức ăn đường chỉ: - hầu hết Unix như hệ thống
  • Vận chuyển trở lại cộng với thức ăn Line: - hệ thống dựa trên Tháng Mười Hai amd MS-DOS
  • Vận chuyển trở lại chỉ : - Đầu tiên của Apple/Mac OS

Vì vậy, những gì bạn đang tạo vào lúc này là dòng mới trên hệ thống Unix. Wikipedia có khá good page về điều này.

Có các công cụ dòng lệnh thực sự unix để thực hiện chuyển đổi. Các lệnh unix2dos và dos2unix chuyển đổi các tệp văn bản ascii về sau và chuyển tiếp giữa các định dạng unix và dos bằng cách chuyển đổi nguồn cấp dữ liệu dòng thành nguồn cấp dữ liệu dòng cộng với dấu xuống dòng và ngược lại.

4

Hãy chắc chắn sử dụng dấu ngoặc kép xung quanh \ r \ n, chứ không phải dấu nháy đơn như đã đề cập trong câu trả lời trước!

0

Tôi gặp phải sự cố tương tự. Sau đó, tôi đã thay thế
báo giá đơn lẻ ' bằng dấu ngoặc kép " xây dựng $ content variable.

tức là giữ dấu ngoặc kép bên ngoài chứ không phải gấp đôi đơn lẻ trong số $ nội dung biến.

Và nó đã hoạt động :)

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