PHP中的CSV操作:读取、写入和数据处理
CSV(逗号分隔值)格式仍然是交换表格数据最流行的方法之一。PHP提供了处理此格式的内置函数,使其成为导入/导出数据、与CRM、会计系统集成以及生成报告的理想选择。在本文中,我们将介绍CSV操作的完整流程:从打开文件到处理转义和编码的复杂情况。
PHP中用于CSV操作的主要函数
PHP有两个关键函数:用于读取的fgetcsv()和用于写入的fputcsv()。它们会自动处理分隔符、引号和转义。
逐行读取CSV文件
使用fgetcsv()读取CSV的基本示例:
<?php$filename = 'data.csv';
if (($handle = fopen($filename, 'r')) !== false) { // 读取标题(第一行) $headers = fgetcsv($handle, 1000, ','); if ($headers !== false) { echo "标题: " . implode(', ', $headers) . "<br>"; // 逐行读取数据 while (($row = fgetcsv($handle, 1000, ',')) !== false) { echo "行: " . implode(' | ', $row) . "<br>"; } } fclose($handle);}?>fgetcsv()的参数:
handle— 文件句柄(fopen的结果)length— 行的最大长度(建议使用0进行自动检测)separator— 字段分隔符(默认为逗号)enclosure— 引号字符(默认为双引号)escape— 转义字符(默认为反斜杠)
将数据写入CSV
fputcsv()函数会自动格式化带有正确转义的行:
<?php$data = [ ['ID', '姓名', 'Email', '注册日期'], [1, '伊万·彼得罗夫', 'ivan@example.com', '2024-01-15'], [2, '玛丽亚·西多罗娃', 'maria@example.com', '2024-02-20'], [3, '阿列克谢 "教授" 伊万诺夫', 'alex@example.com', '2024-03-10']];
$filename = 'users.csv';
if (($handle = fopen($filename, 'w')) !== false) { // 写入BOM以便在Excel中正确显示西里尔字符 fwrite($handle, "\\xEF\\xBB\\xBF"); foreach ($data as $row) { fputcsv($handle, $row, ';'); // 使用分号以兼容Excel } fclose($handle); echo "文件 $filename 已成功创建!";}?>处理大型CSV文件
处理大型文件(数十万行)时,重要的是不要将整个文件加载到内存中。请使用流式处理:
<?phpfunction processLargeCSV($filename, callable $callback) { $handle = fopen($filename, 'r'); if ($handle === false) { throw new Exception("无法打开文件: $filename"); } $headers = fgetcsv($handle, 0, ','); if ($headers === false) { fclose($handle); throw new Exception("空文件或读取标题时出错"); } $rowNumber = 1; while (($row = fgetcsv($handle, 0, ',')) !== false) { if (count($row) !== count($headers)) { // 跳过字段数量不正确的行 continue; } // 将标题与数据组合 $assocRow = array_combine($headers, $row); call_user_func($callback, $assocRow, $rowNumber); $rowNumber++; } fclose($handle);}
// 使用示例:processLargeCSV('bigdata.csv', function($row, $number) { echo "行 #$number: {$row['email']} - {$row['name']}<br>";});?>处理不同的分隔符和编码
通常CSV文件