Hàm fgetcsv() trong PHP
Trần Thị Vân
- 1187
- 09/08/2025
Chức năng của Hàm fgetcsv() trong PHP
Hàm fgetcsv() trong PHP dùng để lấy một dòng của file .csv đưa vô một mảng, mỗi cột sẽ là 1 phần tử trong mảng đó, dòng được lấy là vị trí hiện tại của con trỏ trong tệp .csv, nếu sử dụng vòng lặp thì sau khi lấy một dòng thì con trỏ sẽ đến dòng tiếp theo cho đến khi không còn dòng nào để đọc.
Cú pháp của Hàm fgetcsv() trong PHP
$biến_mảng = fgetcsv($file_đang_ở_chế_độ_mở);
$file_đang_ở_chế_độ_mở: File đang ở chế độ mở.
$biến_mảng: Trả kết quả của 1 dòng về một mảng, mỗi cột trong một dòng là 1 phần tử trong mảng đó.
Code Hàm fgetcsv() trong PHP
Nội dung trong file .csv:
CộtA Cột B
Ma 01 Ma S01
Ma 02 Ma S02
Ma 03 Ma S03
Ma 04 Ma S04
Ma 05 Ma S05
Code Hàm fgetcsv():
<?php
// Quy định chế độ đọc, chuyển chế độ đọc của file ở trạng thái mở
$filedangmo = fopen("thumuctest/test.csv","r");
// Lặp cho tới khi dữ liệu trả về không còn dòng nào để đọc
while (($data = fgetcsv($filedangmo)) !== false) {
// Mỗi lần lặp đọc 1 hàng đưa vào 1 mảng, mỗi cột là một phần tử trong mảng đó, sau đó con trỏ tệp sẽ tới dòng tiếp theo
print_r($data);
echo "<br>";
}
// Đóng trạng thái mở của file
fclose($filedangmo);
?>
Kết quả:
Array ( [0] => Ma 01 [1] => Ma S01 )
Array ( [0] => Ma 02 [1] => Ma S02 )
Array ( [0] => Ma 03 [1] => Ma S03 )
Array ( [0] => Ma 04 [1] => Ma S04 )
Array ( [0] => Ma 05 [1] => Ma S05 )
Cách sử dụng hàm fgetcsv() trong PHP hiệu quả
Để khai thác tốt fgetcsv(), không nên chỉ dừng ở việc đọc từng dòng trong file CSV. Khi đưa vào ứng dụng thực tế, cần quan tâm đến dòng tiêu đề, cách dữ liệu được phân tách, ký tự đặc biệt và khả năng xuất hiện dữ liệu không hợp lệ.
Đọc file CSV có dòng tiêu đề bằng fgetcsv()
Nhiều file CSV thường có dòng đầu tiên chứa tên cột như mã sản phẩm, tên sản phẩm, giá hoặc số lượng. Có thể đọc dòng này trước rồi sử dụng làm tên khóa cho các dòng dữ liệu tiếp theo, giúp quá trình xử lý rõ ràng hơn.
<?php
$file = fopen("products.csv", "r");
$headers = fgetcsv($file);
while (($row = fgetcsv($file)) !== false) {
$product = array_combine($headers, $row);
if ($product !== false) {
echo $product['name'];
}
}
fclose($file);
?>
Cách làm này đặc biệt hữu ích khi cần chuyển dữ liệu CSV thành mảng có cấu trúc để tiếp tục lưu vào cơ sở dữ liệu hoặc xử lý trong ứng dụng. Tuy nhiên, nên kiểm tra số lượng phần tử của dòng dữ liệu trước khi dùng array_combine() để tránh lỗi khi file bị thiếu hoặc thừa cột.
Xử lý dữ liệu CSV khi có dấu phẩy và ký tự đặc biệt
Dấu phẩy không phải lúc nào cũng đánh dấu kết thúc một cột. Một trường dữ liệu có thể chứa dấu phẩy, dấu ngoặc kép hoặc xuống dòng và được đặt trong dấu ngoặc kép. Đây là lý do không nên tự tách dòng CSV bằng explode(), vì cách này có thể chia sai dữ liệu.
fgetcsv() được thiết kế để nhận biết cấu trúc CSV và xử lý các trường được bao quanh bởi ký tự phân cách hoặc dấu bao phù hợp. Khi file sử dụng dấu phân cách khác dấu phẩy, có thể truyền ký tự đó vào tham số tương ứng.
<?php
$file = fopen("products.csv", "r");
while (($row = fgetcsv($file, 0, ";")) !== false) {
echo $row[0];
}
fclose($file);
?>
Với những file được xuất từ các phần mềm khác nhau, cần xác định đúng ký tự phân cách trước khi đọc. Nếu file dùng dấu chấm phẩy nhưng chương trình lại mặc định xử lý bằng dấu phẩy, các cột có thể bị gom thành một trường duy nhất.
Kiểm tra dữ liệu và xử lý lỗi khi đọc file CSV
Không phải file CSV nào cũng có cấu trúc hoàn chỉnh. File có thể không tồn tại, không mở được, chứa dòng trống hoặc có số lượng cột không đồng nhất. Vì vậy, nên kiểm tra kết quả mở file và kết quả trả về từ fgetcsv() trước khi xử lý dữ liệu.
<?php
$file = fopen("products.csv", "r");
if ($file === false) {
exit("Không thể mở file CSV.");
}
while (($row = fgetcsv($file)) !== false) {
if (count($row) < 3) {
continue;
}
// Xử lý dữ liệu tại đây
}
fclose($file);
?>
Việc kiểm tra cấu trúc từng dòng giúp hạn chế lỗi phát sinh khi dữ liệu đầu vào không đúng định dạng dự kiến. Với các hệ thống quan trọng, nên bổ sung bước kiểm tra dữ liệu bắt buộc, làm sạch giá trị và ghi nhận những dòng lỗi thay vì bỏ qua mà không có thông tin.
Lời kết
Cảm ơn các bạn đã tham khảo bài viết Hàm fgetcsv() trong PHP.
- 0 Bình luận
Email, Điện thoại của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *