1

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

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

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

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

我猜我从创建一个流阅读器开始?

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

1 回答 1

1

您可以IteratorAggregate使用Reader. 所以你基本上只是做

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

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

if (!ini_get("auto_detect_line_endings")) {
    ini_set("auto_detect_line_endings", '1');
}
于 2018-10-16T10:45:26.993 回答