PHP项目League CSV读写

wen PHP项目 2

本文目录导读:

PHP项目League CSV读写

  1. 安装
  2. 基本用法
  3. 常见问题处理

我来为您详细介绍 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);

常见问题处理

  1. 编码问题:使用 setOutputBOM(Writer::BOM_UTF8) 解决 Excel 打开乱码
  2. 大文件处理:使用流式处理避免内存溢出
  3. 数据验证:在导入时进行数据清洗和验证
  4. 自定义格式:根据需要设置分隔符、引号字符等

League CSV 库提供了丰富的方法来处理各种 CSV 操作场景,是一个功能完善且性能优秀的 PHP CSV 处理库。

抱歉,评论功能暂时关闭!