League CSV 包 - 从 resource/stream 中一次读取一行

League CSV package - reading one line at a time from a resource/stream

我正在使用 PHP League CSV importer/exporter 在 Laravel 中导入一个大型 CSV 文件。由于文件很大,我想将它流式传输到 CSV 解析器并一次处理一行,而不是将每一行都加载到内存中。

Laravel 将 flysystem 用作底层文件系统,我正在使用它来获取源 CSV 的 PHP 资源。

我不明白的是 - 如果可能的话 - 我可以将该资源流输入 League CSV 以便它一次读取一行供我处理,然后再读取下一行.所有文档似乎都暗示 CSV 文件总是被完全读入内存,而这正是我想要避免的。

我需要使用回调吗?如果是这样,我如何确定流资源一次只根据需要读取一行,而不是一次全部读取?

我想我首先要创建一个流 reader?

use League\Csv\Reader;
$reader = Reader::createFromStream($resource, 'r');

通过使用 ReaderIteratorAggregate 接口,您可以在不加载整个文件的情况下遍历行。所以你基本上只是做

foreach ($reader as $row) {
    // do stuff
}

如果您使用 mac 读取或创建 CSV 文件,您需要将其添加到您的代码中才能正常工作:

if (!ini_get("auto_detect_line_endings")) {
    ini_set("auto_detect_line_endings", '1');
}