2010-02-23 21 views
12

Tôi đang cố gắng phân tích cú pháp các tệp CSV do người dùng tải lên thông qua PHP, nhưng nó không hoạt động đúng cách.CSV không có dấu ngoặc kép không hoạt động với fgetcsv

Tôi đã tải lên một số CSV được định dạng đúng và nó hoạt động tốt, tuy nhiên; Tôi có nhiều người dùng đang cố gắng nhập tệp CSV được xuất từ ​​Excel và họ đang gặp sự cố. Tôi đã so sánh các tập tin với tôi và nhận thấy rằng các tập tin Excel tất cả đều thiếu dấu ngoặc kép xung quanh các mục. Bên cạnh đó, chúng giống hệt nhau. Nếu tôi mở nó và lưu nó với Open Office, mà không thực hiện bất kỳ thay đổi nào thì nó hoạt động. Vì vậy, tôi khá chắc chắn nó liên quan đến các dấu ngoặc kép.

Câu hỏi của tôi là; làm cách nào để đọc các CSV được định dạng không đúng?

CẬP NHẬT: Đã tìm thấy nguyên nhân!

Điều này dành riêng cho phiên bản Excel của Mac. Các ngắt dòng được xử lý khác nhau trên máy Mac vì một số lý do tùy ý, vì vậy trước khi sử dụng fgetcsv, bạn nên thực hiện việc này;

ini_set('auto_detect_line_endings',TRUE); 
+0

Bạn có thể cho chúng tôi biết mã của bạn và cho chúng tôi biết vấn đề là gì? Chúng tôi sử dụng fgetcsv() không có vấn đề, bất kể định dạng. – jasonbar

+0

Cảm ơn anh chàng này !! cuộc sống tiết kiệm –

Trả lời

22

Điều này dành riêng cho phiên bản Excel của Mac. Các ngắt dòng được xử lý khác nhau trên máy Mac vì một số lý do tùy ý, vì vậy trước khi sử dụng fgetcsv, bạn nên thực hiện việc này;

ini_set('auto_detect_line_endings',TRUE); 
+0

cảm ơn bạn! hoạt động hoàn hảo. – tbradley22

+0

Lỗi. Tuyệt vời. Tìm thấy. – Stegrex

1

Nhìn vào manual page of fgetcsv, nguyên mẫu của nó trông như thế này:

array fgetcsv (resource $handle [, int $length 
    [, string $delimiter = ',' [, string $enclosure = '"' 
    [, string $escape = '\\' ]]]]) 

Giá trị mặc định cho $enclosure(ví dụ: tham số thứ 4) là một đôi báo giá.

Điều gì sẽ xảy ra nếu bạn thử xác định rằng bạn không muốn bất kỳ vùng bao vây nào, chỉ định chuỗi trống cho thông số thứ 4 đó?

(Tất nhiên, điều này có thể phá vỡ những gì đang hoạt động - có nghĩa là bạn phải đối phó với hai trường hợp riêng biệt: tệp có trường được bao gồm trong dấu ngoặc kép và tệp không thể đọc trước trường hợp)

+0

Vâng, tôi đã thấy điều đó. Nhưng, như bạn đã nói, nó phá vỡ những gì hiện đang hoạt động. Không có cách nào đơn giản để kiểm tra định dạng được lưu trữ và chuyển đổi hành vi một cách thích hợp? –

+0

Tôi cho rằng một số regex sẽ cho phép bạn xác định định dạng tệp nào ;;; giải pháp khác sẽ là luôn luôn thử giải pháp * đầu tiên (trường hợp thường xuyên nhất) *, và nếu nó không hoạt động, hãy thử giải pháp thứ hai ;; xem xét tất cả các dòng của tập tin của bạn có thể được hình thành theo cùng một cách, làm thử nghiệm chỉ cho dòng đầu tiên là đủ - có nghĩa là bạn sẽ chỉ làm 1 "vô dụng" gọi để 'fgetcsv'. –

+0

Tôi đã thử rằng, nó biến ra thùng trống không hoạt động ... –

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