lukaswerner / php-csv
PHP 的简单 CSV 处理库
Requires
- php: >=7.1.0
Requires (Dev)
- phpunit/phpunit: ^5.7
README
此库在处理 PHP 中的 CSV 文件时注重简洁性和内存效率。
功能
- 简单的 API
- 逐行读取 CSV 文件
- 内存效率:文件逐行读取,大文件无内存问题
- 使用行和块回调处理 CSV
- 全面文档化
- 全面单元测试
- Composer 就绪
系统需求
要使用 php-csv
,您需要 PHP >= 7.1.0,但推荐使用最新稳定的 PHP 版本。
安装
使用 Composer 安装 php-csv
。
$ composer require lukaswerner/php-csv
使用
您可以通过将有效的 \SplFileInfo
对象传递给构造函数来初始化主 PhpCsv\Csv
类的对象。
$fileInfo = new \SplFileInfo('/path/to/file.csv');
$csv = new \PhpCsv\Csv($fileInfo);
您现在有一个易于理解的 API 来处理您的 CSV 文件。每个处理方法首先将文件重置,这样您就不会遇到文件指针的问题。如果您的文件不包含标题行,您必须调用 $csv->setContainsHeader(false);
。
行数
您可以通过调用 $csv->count();
轻松地计算 CSV 文件中的行数。此方法将仅检查所有行一次。第二次调用时,它将使用之前设置的价值。为了避免这种情况,您必须创建一个新的 \PhpCsv\Csv
对象。
生成器返回值
使用 $csv->rows()
调用创建的生成器现在在没有中断的情况下将具有返回值。这意味着,在迭代完您的 CSV 文件中的所有行后,您可以将行数作为生成器的返回值获取。您可以这样做
$rowsGenerator = $csv->rows();
foreach ($rowsGenerator as $row) {
// Do something
}
$numberOfLines = (int)$rowsGenerator->getReturn();
请注意,如果在循环中使用 break,这将抛出异常。同样,现在 $csv->process()
将返回生成器返回值或 null(如果已中断)。
读取标题
您可以通过调用 $csv->header();
来读取标题字段。这将返回包含标题信息的字符串数组。此方法将仅检查所有行一次。第二次调用时,它将使用之前设置的价值。为了避免这种情况,您必须创建一个新的 \PhpCsv\Csv
对象。
遍历行
您可以通过这样做来遍历 CSV 文件的全部行
foreach ($csv->rows() as $lineNumber => $row) {
// Do somethine with row
}
$lineNumber
包含当前行号,从 1
开始。如果存在标题,则不包括标题。因此,具有标题和一行的文件在该行上 $lineCount = 1
。
rows()
方法返回一个 PHP 生成器,循环可以根据需要继续或停止。
使用回调处理
php-csv
库提供了一个舒适的 process()
方法,用于使用回调处理 CSV 文件。您可以这样做
$csv->process(
function (array $row, int $lineNumber): bool {
// Do something with your data
return true; // If you return false here, the processing will stop
}
);
分块
回调处理还允许分块。这意味着您对每一行都有一个回调,另外还有一个对每一块的回调。首先,您可以设置块大小为 $csv->setChunkSize(500)
(默认为 1000),然后像这样调用 process()
方法
$csv->process(
function (array $row, int $lineNumber): bool {
// Do something with your data
return true; // If you return false here, the processing will stop
},
function (): void {
// Will be called e.g. every 500th row
// you can flush your values to db or something like that
}
);
请注意,当您从行回调返回 false
时,块回调将最后被调用一次。这样您就可以刷新不完整的块。
贡献
欢迎贡献,并将得到完全认可。请随时打开问题并请求访问存储库。
变更日志
请参阅CHANGELOG以获取关于最近更改的更多信息。
许可证
GNU通用公共许可证v3.0。请参阅LICENSE以获取更多信息。