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

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

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

开始课程

PHP中的CSV操作:完整指南



CSV(逗号分隔值)是交换表格数据最流行的格式之一。在PHP中,CSV操作是原生支持的,无需安装额外的库。本文将涵盖所有方面:从基本读取到高级大文件处理。



CSV操作的核心函数



PHP提供了两个用于CSV操作的关键函数:

  • fgetcsv() — 从文件中读取CSV行
  • fputcsv() — 以CSV格式写入一行


此外,还会使用标准的文件操作函数:fopen()、fclose()、file()。



在PHP中读取CSV文件



读取CSV最简单的方法是使用while循环配合fgetcsv():



<?php$filename = 'data.csv';

if (($handle = fopen($filename, 'r')) !== false) { // 读取标题(第一行) $headers = fgetcsv($handle, 1000, ','); // 读取其余行 while (($row = fgetcsv($handle, 1000, ',')) !== false) { echo "姓名: " . $row[0] . ", 邮箱: " . $row[1] . "<br>"; } fclose($handle);}?>


fgetcsv()的参数:

  • handle — 文件句柄
  • length — 行的最大长度(默认0表示无限制)
  • separator — 字段分隔符(默认为逗号)
  • enclosure — 引号字符(默认为双引号)
  • escape — 转义字符(默认为反斜杠)


使用自定义分隔符读取CSV



并非所有CSV都使用逗号。常见的有分号(;)或制表符:



<?php$handle = fopen('data.tsv', 'r');while (($row = fgetcsv($handle, 1000, "\\t")) !== false) {    print_r($row);}fclose($handle);?>


将数据写入CSV



fputcsv()函数会自动处理转义和引号:



<?php$data = [    ['伊万', 'ivan@example.com', 25],    ['玛丽亚', 'maria@example.com', 30],    ['彼得', 'petr@example.com', 28]];

$handle = fopen('users.csv', 'w');

// 写入标题fputcsv($handle, ['姓名', '邮箱', '年龄']);

// 写入数据foreach ($data as $row) { fputcsv($handle, $row);}

fclose($handle);echo "CSV文件已成功创建!";?>


fputcsv()的参数:

  • handle — 文件句柄
  • fields — 要写入的字段数组
  • separator — 字段分隔符
  • enclosure — 引号字符
  • escape — 转义字符


导出CSV数据供下载



通常需要生成CSV并提供给用户下载:



<?php$data = [    ['商品', '价格', '数量'],    ['笔记本电脑', 75000, 10],    ['鼠标', 1500, 50],    ['键盘', 3500, 30]];

header('Content-Type: text/csv; charset=utf-8');header('Content-Disposition: attachment; filename="products.csv"');

$output = fopen('php://output', 'w');// 添加BOM以确保Excel中正确显示西里尔字符fprintf($output, chr(0xEF).chr(0xBB).chr(0xBF));

foreach ($data as $row) { fputcsv($output, $row);}

fclose($output);exit;?>


处理大型CSV文件



处理大型文件(数十万行)时,务必避免将整个文件加载到内存中。请使用流式处理:



<?phpfunction processLargeCSV($filename, $batchSize = 1000) {    $handle = fopen($filename,                    

推荐