PHP中的CSV操作:完整指南
CSV(逗号分隔值)是交换表格数据最流行的格式之一。PHP既有内置的CSV操作函数,也有强大的第三方库。在本文中,我们将介绍在PHP中读取、写入和处理CSV文件的所有主要方法。
PHP内置的CSV操作函数
PHP提供了几个内置函数,无需安装额外库即可处理CSV文件。主要函数有:
fgetcsv()— 从文件中读取一行并将其解析为数组fputcsv()— 将数组以CSV格式写入文件str_getcsv()— 将CSV字符串解析为数组
使用fgetcsv读取CSV文件
fgetcsv()函数从打开的文件中读取一行,并以数组形式返回。读取整个文件的示例:
<?php$filename = 'data.csv';
if (($handle = fopen($filename, 'r')) !== false) { while (($data = fgetcsv($handle, 1000, ',')) !== false) { // $data — 包含行数据的数组 echo implode(' | ', $data) . ""; } fclose($handle);}?>fgetcsv()函数的参数:
handle— 文件句柄length— 行的最大长度(通常为0或1000)separator— 字段分隔符(默认为逗号)enclosure— 字段包围字符(默认为双引号)escape— 转义字符(默认为反斜杠)
将数据写入CSV文件
写入数据使用fputcsv()函数。它接受一个数组并将其转换为CSV字符串:
<?php$data = [ ['姓名', '年龄', '城市'], ['伊万', 25, '莫斯科'], ['玛丽亚', 30, '圣彼得堡'],];
$filename = 'output.csv';$handle = fopen($filename, 'w');
foreach ($data as $row) { fputcsv($handle, $row, ';', '"');}
fclose($handle);echo "文件 $filename 已成功创建!";?>在此示例中,我们使用分号(;)作为分隔符,这在俄语CSV文件中很常见。
处理大型CSV文件
处理大文件(数十万行)时,重要的是不要将整个文件加载到内存中。请使用逐行读取:
<?phpfunction processLargeCSV($filename) { $handle = fopen($filename, 'r'); // 如果有标题行,则跳过 $header = fgetcsv($handle); while (($row = fgetcsv($handle)) !== false) { // 处理每一行 $processed = array_map('trim', $row); // 这里可以放你的处理逻辑 yield $processed; // 使用生成器 } fclose($handle);}
// 使用foreach (processLargeCSV('bigdata.csv') as $row) { // 分别处理每一行 echo "已处理行:" . implode(',', $row) . "";}?>使用生成器(yield)可以处理任意大小的文件而不会导致内存溢出。
用于高级操作的League\\Csv库
对于更复杂的任务,建议使用league/csv库。它提供了方便的面向对象接口和许多额外功能。
通过Composer安装:
composer require league/csv使用示例:
<?phprequire 'vendor/autoload.php';
use League\\Csv\\Reader;use League\\Csv\\Writer;
// 读取CSV$csv = Reader::createFromPath('data.csv', 'r');$csv->setHeaderOffset(0); // 第一行为标题行
// 获取所有记录为关联