CSV (Comma-Separated Values) 是資料交換最通用格式。PHP 內建 fgetcsv()、fputcsv() 等函式,能正確處理欄位包含逗號、引號、換行等複雜情況,比手動 explode() 可靠得多。
<?php
$list = array(
'aaa,bbb,ccc,dddd',
'11,22,33',
'"php","java"'
);
$fp = fopen('file.csv', 'w');
foreach ($list as $line) {
fputcsv($fp, explode(',', $line));
}
fclose($fp);
?>
<?php
$data = [
['姓名', '年齡', '備註'],
['王小明', 25, '含有"雙引號"和,逗號'],
['李大仁', 30, "換行\n測試"],
];
$fp = fopen('export.csv', 'w');
// 寫入 BOM 讓 Excel 正確識別 UTF-8
fwrite($fp, "\xEF\xBB\xBF");
foreach ($data as $row) {
fputcsv($fp, $row);
}
fclose($fp);
?>
關鍵點:
✅ fputcsv() 自動處理雙引號跳脫、欄位加引號
✅ 寫入 UTF-8 BOM (\xEF\xBB\xBF) 讓 Excel 直接開啟不亂碼
✅ 直接傳入陣列,無需手動組字串
<?php
$row = 1;
$handle = fopen("file.csv", "r");
while ($data = fgetcsv($handle, 1000, ",")) {
$num = count($data);
echo "<p> 第 $row 行有 $num 個欄位: <br>\n";
$row++;
for ($c = 0; $c < $num; $c++) {
// 編碼轉換:Big5/GBK → UTF-8
$data[$c] = iconv("gbk", "utf-8//IGNORE", $data[$c]);
echo $data[$c] . "<br>\n";
}
}
fclose($handle);
?>
<?php
function get_file_line($file_name, $line_no) {
$n = 0;
$handle = fopen($file_name, 'r');
if ($handle) {
while (!feof($handle)) {
++$n;
$out = fgets($handle, 4096);
if ($line_no == $n) break;
}
fclose($handle);
}
return ($line_no == $n) ? $out : false;
}
echo get_file_line("data.csv", 10);
?>
<?php
function get_file_lines($file_name, $start, $end) {
$n = 0;
$lines = [];
$handle = fopen($file_name, "r");
if ($handle) {
while (!feof($handle)) {
++$n;
$out = fgets($handle, 4096);
if ($start <= $n) $lines[] = $out;
if ($end == $n) break;
}
fclose($handle);
}
return ($end == $n) ? $lines : false;
}
$rows = get_file_lines("data.csv", 11, 20);
foreach ($rows as $row) echo $row . "<br>";
?>
| 場景 | 建議做法 |
|---|---|
| 超大檔 (GB 級) | 分塊讀取 + 生成器 yield、或用 Linux split 切分後平行處理 |
| 記憶體限制 | ini_set('memory_limit', '512M')、避免一次載入全部 |
| 編碼不確定 | mb_detect_encoding() 檢測後再 iconv() |
| 異常欄位數 | 檢查 count($data) 一致性、記錄異常行 |
| 來源編碼 | 目標編碼 | iconv 參數 | 說明 |
|---|---|---|---|
| Big5 (繁中) | UTF-8 | iconv("big5", "utf-8//IGNORE", $str) | 台灣常見 |
| GBK/GB2312 (簡中) | UTF-8 | iconv("gbk", "utf-8//IGNORE", $str) | 大陸常見 |
| UTF-8 with BOM | UTF-8 | 移除 BOM: ltrim($str, "\xEF\xBB\xBF") | Excel 匯出常見 |
| SJIS | UTF-8 | iconv("sjis-win", "utf-8//IGNORE", $str) | 日文系統 |
SplFileObject 物件導向介面,支援 setCsvControl()fgetcsv() 回傳 false 代表錯誤或 EOF,需嚴格判斷<?php
$file = new SplFileObject("data.csv");
$file->setFlags(SplFileObject::READ_CSV);
$file->setCsvControl(","); // 分隔符
foreach ($file as $row) {
// $row 已是陣列
var_dump($row);
}
?>