Vấn đề là tệp CSV chứa giá trị bằng dấu phẩy và nó đọc giá trị thoát [có dấu ngoặc kép] như hiện tại
E. g.
$data = fgetcsv[$handle,1000,",","'"];
0 được đọc là $data = fgetcsv[$handle,1000,",","'"];
1 & $data = fgetcsv[$handle,1000,",","'"];
2 & $data = fgetcsv[$handle,1000,",","'"];
3Vấn đề có thể được giải quyết bằng cách thay đổi dấu ngoặc kép thành dấu ngoặc đơn. Tuy nhiên, tôi không muốn chỉnh sửa mọi tệp CSV mọi lúc
Mã mà tôi sử dụng là như sau
$handle = fopen[$path, "r"]; $data = fgetcsv[$handle,1000,",","'"]; do { **READ CSV** } while [$data = fgetcsv[$handle,5000,","]];
Điều gì sẽ là cách tốt nhất để xử lý vấn đề này?
Giải pháp tốt nhất
Thay đổi dòng này
$data = fgetcsv[$handle,1000,",","'"];
đến
$data = fgetcsv[$handle,1000,",",'"'];
hoặc chỉ bỏ qua hai tham số cuối cùng vì chúng là giá trị mặc định
$data = fgetcsv[$handle,1000];
Tham số thứ tư cho fgetcsv là ký tự bao vây cho biết cách đóng khung các trường có thể có dấu phân cách bên trong chúng
Giải pháp liên quan
Mysql – Cách xuất kết quả truy vấn MySQL ở định dạng CSV
Từ Lưu kết quả truy vấn MySQL vào tệp văn bản hoặc tệp CSV
SELECT order_id,product_name,qty
FROM orders
WHERE foo = 'bar'
INTO OUTFILE '/var/lib/mysql-files/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
Ghi chú. Cú pháp đó có thể cần phải được sắp xếp lại để
SELECT order_id,product_name,qty
INTO OUTFILE '/var/lib/mysql-files/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM orders
WHERE foo = 'bar';
trong các phiên bản mới hơn của MySQL
Sử dụng lệnh này, tên cột sẽ không được xuất
Cũng lưu ý rằng
$data = fgetcsv[$handle,1000,",","'"];
0 sẽ có trên máy chủ đang chạy MySQL. Người dùng mà quy trình MySQL đang chạy bên dưới phải có quyền ghi vào thư mục đã chọn, nếu không lệnh sẽ thất bạiNếu bạn muốn ghi đầu ra vào máy cục bộ của mình từ máy chủ từ xa [đặc biệt là máy được lưu trữ hoặc máy ảo hóa như Heroku hoặc Amazon RDS], thì giải pháp này không phù hợp
Excel – Tạo tệp CSV cho Excel, cách có một dòng mới bên trong một giá trị
Bạn chỉ nên có các ký tự khoảng trắng ở đầu các trường khi các ký tự khoảng trắng là một phần của dữ liệu. Excel sẽ không loại bỏ các khoảng trắng ở đầu. Bạn sẽ nhận được khoảng trống không mong muốn trong tiêu đề và trường dữ liệu của mình. Tồi tệ hơn,
$data = fgetcsv[$handle,1000,",","'"];
1 lẽ ra phải "bảo vệ" ngắt dòng đó trong cột thứ ba sẽ bị bỏ qua vì nó không ở đầu trườngNếu bạn có các ký tự không phải ASCII [được mã hóa bằng UTF-8] trong tệp, thì bạn phải có BOM UTF-8 [3 byte,
$data = fgetcsv[$handle,1000,",","'"];
2] ở đầu tệp. Nếu không, Excel sẽ diễn giải dữ liệu theo mã hóa mặc định của ngôn ngữ của bạn [e. g. cp1252] thay vì utf-8 và các ký tự không phải ASCII của bạn sẽ bị chuyển vào thùng rác PHP có một số chức năng tuyệt vời để phân tích cú pháp và xuất ra các tệp giá trị được phân tách bằng dấu phẩy [CSV], nhưng nó không thành công khi trả về dữ liệu đó dưới dạng chuỗi. Chắc chắn, bạn có thể ánh xạ qua mảng bằng
$data = fgetcsv[$handle,1000,",","'"];
4, nhưng kết quả của việc đó sẽ như thế nào nếu bạn đang xử lý thông tin có chứa dấu phẩy trong chính các giá trị đó? Trước hết, các chức năng sau được hỗ trợ bởi PHP out-of-the-box
- fgetcsv - Tương tự như fgets[] ngoại trừ việc fgetcsv[] phân tích cú pháp dòng nó đọc cho các trường ở định dạng CSV và trả về một mảng chứa các trường đã đọc
- fputcsv - Định dạng một dòng [được truyền dưới dạng một mảng trường] dưới dạng CSV và ghi nó [được kết thúc bởi một dòng mới] vào phần xử lý tệp đã chỉ định
- str_getcsv - [PHP 5. 3. 0 +] Phân tích cú pháp đầu vào chuỗi cho các trường ở định dạng CSV và trả về một mảng chứa các trường đã đọc
Đoạn mã bên dưới triển khai một str_putcsv mới, dự kiến một mảng gồm các mảng kết hợp và trả về một chuỗi có định dạng CSV
/**
* Convert a multi-dimensional, associative array to CSV data
* @param array $data the array of data
* @return string CSV text
*/
function str_putcsv[$data] {
# Generate CSV data from array
$fh = fopen['php://temp', 'rw']; # don't create a file, attempt
# to use memory instead
# write out the headers
fputcsv[$fh, array_keys[current[$data]]];
# write out the data
foreach [ $data as $row ] {
fputcsv[$fh, $row];
}
rewind[$fh];
$csv = stream_get_contents[$fh];
fclose[$fh];
return $csv;
}
Phần kết luận
Chức năng trên đã phát triển từ một năm viết tập lệnh xuất dữ liệu để phân phối email. Có các chức năng khác thực hiện chuyển đổi định dạng sang CSV, nhưng một số giới thiệu chi phí bổ sung để khắc phục các thiếu sót của định dạng CSV. Điều tôi thích là đoạn mã trên rõ ràng và ngắn gọn. Bằng cách gia công phần mềm nặng cho hàm
$data = fgetcsv[$handle,1000,",","'"];
5 tích hợp sẵn của PHP, nó không cần phải liên quan đến những thứ như $data = fgetcsv[$handle,1000,",","'"];
6 để thoát các giá trị CSV bằng dấu phẩy hoặc dấu ngoặc kép