PHP中的CSV操作:读取、写入和数据处理

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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文件

推荐