我正在使用 PHP League CSV 导入器/导出器在 Laravel 中导入一个大型 CSV 文件。由于文件很大,我想将其流式传输到 CSV 解析器并一次处理一行,而无需将每一行都加载到内存中。
Laravel使用flysystem作为底层文件系统,我正在使用它来获取源CSV的PHP资源。
我不明白的是,如果可能的话,我可以如何将该资源流输入联盟 CSV 中,以便它一次读取一行供我处理,然后再读取下一行。所有文档似乎都暗示CSV文件始终完全读入内存,这就是我想避免的。
我需要使用回调吗?如果是这样,我如何确定根据需要一次只读取一行流资源,而不是一次读取所有内容?
我猜我从创建一个流阅读器开始?
use LeagueCsvReader;
$reader = Reader::createFromStream($resource, 'r');
您可以使用Reader
的IteratorAggregate
接口在不加载整个文件的情况下循环访问行。所以你基本上只是做
foreach ($reader as $row) {
// do stuff
}
如果您使用 mac 读取或创建 CSV 文件,则需要将其添加到代码中才能正常工作:
if (!ini_get("auto_detect_line_endings")) {
ini_set("auto_detect_line_endings", '1');
}