本文目录导读:

我来为您详细介绍 PHP 的 League CSV 库,这是一个功能强大的 CSV 文件读写库。
安装
通过 Composer 安装:
composer require league/csv
基本用法
读取 CSV 文件
<?php
require 'vendor/autoload.php';
use League\Csv\Reader;
use League\Csv\Statement;
// 读取 CSV 文件
$csv = Reader::createFromPath('data.csv', 'r');
$csv->setHeaderOffset(0); // 第一行作为表头
// 获取所有记录
$records = $csv->getRecords();
foreach ($records as $record) {
print_r($record);
}
// 获取指定范围的记录
$stmt = Statement::create()
->offset(0)
->limit(10);
$records = $stmt->process($csv);
foreach ($records as $record) {
echo $record['name'] . "\n";
}
写入 CSV 文件
<?php
require 'vendor/autoload.php';
use League\Csv\Writer;
// 创建写入器
$writer = Writer::createFromPath('output.csv', 'w+');
// 写入表头
$writer->insertOne(['ID', '姓名', '年龄', '邮箱']);
// 写入单行数据
$writer->insertOne(['1', '张三', '25', 'zhangsan@example.com']);
$writer->insertOne(['2', '李四', '30', 'lisi@example.com']);
// 批量写入数据
$data = [
['3', '王五', '28', 'wangwu@example.com'],
['4', '赵六', '35', 'zhaoliu@example.com'],
];
$writer->insertAll($data);
高级读取操作
<?php
require 'vendor/autoload.php';
use League\Csv\Reader;
use League\Csv\Statement;
$csv = Reader::createFromPath('users.csv', 'r');
$csv->setHeaderOffset(0);
// 过滤数据
$stmt = Statement::create()
->where(function ($record) {
return $record['age'] >= 18 && $record['status'] === 'active';
})
->orderBy(function ($a, $b) {
return strcmp($a['name'], $b['name']);
});
$records = $stmt->process($csv);
// 转换为数组
$allRecords = iterator_to_array($records, false);
// 获取指定列
$names = $csv->fetchColumn('name');
foreach ($names as $name) {
echo $name . "\n";
}
CSV 转换和导出
<?php
require 'vendor/autoload.php';
use League\Csv\Writer;
use League\Csv\CharsetConverter;
// 创建 CSV 并设置编码
$writer = Writer::createFromString();
$writer->setDelimiter(',');
$writer->setEnclosure('"');
$writer->setEscape('\\');
// 添加 BOM 用于 Excel 兼容性
$writer->setOutputBOM(Writer::BOM_UTF8);
// 写入数据
$writer->insertOne(['ID', '名称', '价格']);
$writer->insertOne(['1', '商品A', '100.00']);
$writer->insertOne(['2', '商品B', '200.00']);
// 获取 CSV 字符串
$csvContent = $writer->getContent();
// 直接输出到浏览器下载
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="export.csv"');
echo $csvContent;
处理大文件
<?php
require 'vendor/autoload.php';
use League\Csv\Reader;
use League\Csv\Statement;
// 分块读取大文件
$csv = Reader::createFromPath('large_file.csv', 'r');
$csv->setHeaderOffset(0);
$chunkSize = 1000;
$offset = 0;
while (true) {
$stmt = Statement::create()
->offset($offset)
->limit($chunkSize);
$records = $stmt->process($csv);
if (count($records) === 0) {
break;
}
foreach ($records as $record) {
// 处理每条记录
processRecord($record);
}
$offset += $chunkSize;
}
自定义分隔符和格式
<?php
require 'vendor/autoload.php';
use League\Csv\Reader;
use League\Csv\Writer;
// 读取 TSV 文件(制表符分隔)
$csv = Reader::createFromPath('data.tsv', 'r');
$csv->setDelimiter("\t");
$csv->setEnclosure('"');
$csv->setEscape('\\');
// 写入分号分隔的 CSV
$writer = Writer::createFromPath('output.csv', 'w+');
$writer->setDelimiter(';');
$writer->setEnclosure('"');
$writer->insertOne(['ID', 'Name', 'Description']);
数据验证和清理
<?php
require 'vendor/autoload.php';
use League\Csv\Reader;
use League\Csv\Statement;
$csv = Reader::createFromPath('data.csv', 'r');
$csv->setHeaderOffset(0);
// 跳过空行
$csv->skipEmptyRecords();
// 自定义行过滤
$stmt = Statement::create()
->where(function ($record) {
// 过滤无效数据
return !empty($record['email']) &&
filter_var($record['email'], FILTER_VALIDATE_EMAIL);
});
$validRecords = $stmt->process($csv);
完整示例:CSV 导入导出功能
<?php
require 'vendor/autoload.php';
use League\Csv\Reader;
use League\Csv\Writer;
class CsvHandler {
// 导入 CSV 到数组
public function import($filePath) {
$csv = Reader::createFromPath($filePath, 'r');
$csv->setHeaderOffset(0);
$data = [];
foreach ($csv->getRecords() as $record) {
$data[] = $record;
}
return $data;
}
// 导出数据到 CSV
public function export($data, $filePath, $headers = []) {
$writer = Writer::createFromPath($filePath, 'w+');
// 设置 BOM 以支持中文
$writer->setOutputBOM(Writer::BOM_UTF8);
// 写入表头
if (!empty($headers)) {
$writer->insertOne($headers);
}
// 写入数据
foreach ($data as $row) {
$writer->insertOne($row);
}
return true;
}
// 下载 CSV
public function download($data, $filename, $headers = []) {
$writer = Writer::createFromString();
$writer->setOutputBOM(Writer::BOM_UTF8);
if (!empty($headers)) {
$writer->insertOne($headers);
}
$writer->insertAll($data);
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Pragma: no-cache');
header('Expires: 0');
echo $writer->getContent();
exit;
}
}
// 使用示例
$handler = new CsvHandler();
// 导入 CSV
$data = $handler->import('import.csv');
// 导出 CSV
$headers = ['ID', 'Name', 'Email'];
$handler->export($data, 'export.csv', $headers);
// 下载 CSV
$handler->download($data, 'download.csv', $headers);
常见问题处理
- 编码问题:使用
setOutputBOM(Writer::BOM_UTF8)解决 Excel 打开乱码 - 大文件处理:使用流式处理避免内存溢出
- 数据验证:在导入时进行数据清洗和验证
- 自定义格式:根据需要设置分隔符、引号字符等
League CSV 库提供了丰富的方法来处理各种 CSV 操作场景,是一个功能完善且性能优秀的 PHP CSV 处理库。