Cẩn thận khi sử dụng PHP fgetcsv
Trong quá trình xây dựng các ứng dụng, các lập trình viên thường ít quan tâm đến vấn đề import/export dữ liệu. Có lẽ là bởi đây là tính năng “giá trị gia tăng” và có thể “để mai tính”.
Tuy nhiên, với khách hàng thì khác. Họ có thể sẽ đòi hỏi rất nhiều ở tính năng import/export này, theo các tiêu chuẩn khác nhau.
Tôi sẽ không tập chung vào các yêu cầu “nâng cao” mà khách hàng có thể nghĩ ra (ví dụ như định nghĩa các giá trị thay thế Yes->1, No->0, hay lấy các giá trị mặc định…). Tôi chỉ muốn tạo một vài chú ý khi sử dụng PHP fgetcsv cho việc import dữ liệu dưới định dạng csv.
Đây là một định dạng rất đơn giản nhưng thông dụng, nó có thể được soạn thảo bởi plaintext editor hoặc ứng dụng excel like.
Và tất nhiên sử dụng fgetcsv là giải pháp đầu tiên mà ta nghĩ tới. Tuy nhiên khi sử dụng fgetcsv cần phải lưu ý:
1. Encoding của import file tốt nhất nên là utf8. Nếu không bạn có thể gặp các lỗi mất mát các ký tự đặc biệt khi đọc với fgetcsv như là các ký tự điều khiển ASCII chẳng hạn. Nếu bạn phải hỗ trợ các encoding khác, tốt nhất là nên sử dụng các hàm stream_filter_* để tự động chuẩn hóa dữ liệu nhận được về dạng utf8. Làm như sau $fp sẽ luôn được đọc dưới dạng utf8 với fgetcsv:
data = utf8_encode($bucket->data); $consumed += $bucket->datalen; stream_bucket_append($out, $bucket); } return PSFS_PASS_ON; } } $fp = @fopen($fileName, "r"); stream_filter_register("utf8encode", "utf8encode_filter") or die("Failed to register filter"); stream_filter_prepend($fp, "utf8encode"); ?>
2. Một tiện lợi và … tiềm ẩn nhiều nguy cơ đó là việc fgetcsv hỗ trợ multiple lines data, có nghĩa là dữ liệu có thể nằm trên nhiều dòng. Nó phụ thuộc vào format của file csv. Và một sơ xuất nào đó (người soạn csv không dùng tools chuyên dụng mà lại xài notepad chẳng hạn. Bạn có thể thừa hoặc thiếu chỉ một dấu ” thôi, thế là việc đọc csv sai bét cả. Tiềm tàng lớn nhất là việc ý đồ của bạn là mỗi record dữ liệu chỉ nằm trên một dòng. Nhưng sơ xuất khiến cho một record có một trường lấy toàn bộ các dòng tiếp theo trong file. Điều này dẫn đến việc chiều dài của dữ liệu nhận được lớn vượt quá giới hạn cho phép. Nếu file csv của bạn lớn, nó có thể sinh ra lỗi “trang trắng” (vì server từ chối xử lý tiếp vì một lý do nào đó liên quan đến dữ liệu của bạn).
Giải pháp toàn diện nhất cho việc này là sử dụng một csv validation cho file csv, trong đó quy định chiều dài tối đa của một trường dữ liệu cụ thể. Với php 5.3.x, chúng ta có thể đọc từng dòng của file và sử dụng str_getcsv cho dòng này (nếu ta luôn đảm bảo một record dữ liệu chỉ nằm trên một dòng csv).
– Cập nhật với php 5.2.x tôi đã có một giải pháp như sau để luôn lấy dữ liệu trên một dòng –
3. Với file dữ liệu lớn, sử dụng fgetcsv khá là chậm, với MySQL ta có giải pháp thay thế là LOAD DATA INFILE để đưa dữ liệu vào một bảng tạm. LOAD DATA INFILE có thể import 5M dữ liệu vào bảng tạm chỉ trong vòng 1 giây. Sau đó sẽ bỏ qua fgetcsv mà đơn giản là chỉ thao tác với các dữ liệu đã nhận được trong bảng tạm.
(i-php.net)
Các tin khác cùng chuyên mục
- Kỹ thuật lập trình HTML/CSS mới nhất 2020 - 04
- Funny web2.0
- Giải thử vài câu đề thi tốt nghiệp ptth môn toán
- MỘT NGÀY PHẢI KHÁC MỌI NGÀY
- Level 1 - Lập trình hướng đối tượng (P2)
- Level 1 - Lập trình hướng đối tượng (P1)
- PHP 5.3, Phần 3: Không gian tên
- PHP 5.3, Phần 2: Bao đóng và các hàm lambda
- PHP 5.3, Phần 1: Các thay đổi về giao diện đối tượng
- Tăng tốc độ xử lý CSDL MySQL
Liên kết
Tin được quan tâm nhất
- Ant Group của Jack Ma hé lộ bước đi đầu tiên...
- Ô tô giao hàng tự lái sẽ bắt đầu hoạt...
- Clip cô giáo phạt học sinh tự ném vỡ...
- Tiền điện tử lớn thứ ba thế giới Ripple...
- Joe Biden kêu gọi hiện đại hóa hệ thống...
- Viettel khai trương nền tảng Hồ sơ sức khỏe...
- Các hãng di động nên ngừng cãi nhau về việc...
- Công nghệ AI của Alibaba và Tân Hoa Xã: Đối...
- Một năm đáng thất vọng của YouTube trên toàn...
- EVN lần đầu diễn tập an toàn thông tin mạng...
- Đây là chiếc iPhone được mua nhiều nhất...
- Bộ Tài chính ra quy chế mới về quản lý, sử...
- Cập nhật nhãn mới giúp người tiêu dùng...
- Kiếm tiền từ 5G: Thách thức lớn nhất của...
- "Hô biến" iPhone thành cục đá: Có thể bị...
- Phí trước bạ ô tô không gia hạn giảm, sẽ...
- Tại sao Apple chế tạo ô tô?
- Viettel cung cấp dịch vụ 5G tại thành phố...
- Đội KingTigerPrawn của Hàn Quốc giành giải...
- Thứ trưởng Phan Tâm: “Triển khai hạ tầng 5G...
- Nhiều mẫu iPhone chính hãng đang khan hàng tại...
- Mỹ quy định drone cần có ID, trang bị đèn ban...
- Trung Quốc điều tra Alibaba: Bài học cho Jack Ma...
- Chuyên gia dự báo 5 xu hướng tấn công mạng...
- Apple MagSafe vẫn còn rất nửa vời
- Các tỉnh cuối cùng đã ngừng phát sóng...
- 55/63 tỉnh thành sử dụng Zalo trong cải cách...
- Headline: CR7: “Mong muốn của tôi là luôn...
- Samsung dự kiến xuất xưởng dưới 300 triệu...
- Vì sao Trung Quốc ‘sờ gáy’ Alibaba?
- Những smartphone được người Việt mua nhiều...
- Vì sao mua hàng ở sàn TMĐT Mỹ không cần...
- Đằng sau bức ảnh động viên Đà Nẵng chiến...
- VNPT cung cấp MyTV Box 2020 - Tính năng nâng cấp...
- Clip hành động ghê tởm của shipper trước khi...
- Các đội thi chung kết WhiteHat Grand Prix 6 phát...