[英]League CSV package - reading one line at a time from a resource/stream
我正在使用PHP League CSV导入器/导出器在 Laravel 中导入一个大型 CSV 文件。 由于文件很大,我想将它流式传输到 CSV 解析器并一次处理一行,而不是将每一行都加载到内存中。
Laravel 使用 flysystem 作为底层文件系统,我使用它来获取源 CSV 的 PHP 资源。
我不明白的是 - 如果可能的话 - 我可以将该资源流输入到 League CSV 中,以便它一次读取一行供我处理,然后再读取下一行。 所有文档似乎都暗示 CSV 文件总是被完全读入内存,而这正是我想要避免的。
我需要使用回调吗? 如果是这样,我如何确定流资源仅根据需要一次被读取一行,而不是一次全部读取?
我猜我从创建一个流阅读器开始?
use League\Csv\Reader;
$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');
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.