本文目录导读:

我来为您详细介绍 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 处理库。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播