Пакет League CSV - чтение одной строки за раз из ресурса / потока - PullRequest
0 голосов
/ 16 октября 2018

Я использую PHP League CSV импортер / экспортер для импорта большого файла CSV в Laravel.Поскольку файл большой, я хотел бы передать его в анализатор CSV и обрабатывать его по одной строке за раз, не загружая каждую строку в память.

Laravel использует flysystem для основной файловой системы, и я используючтобы получить ресурс PHP для исходного CSV.

Что я не понимаю, так это как - если это вообще возможно - я могу передать этот поток ресурсов в League CSV, чтобы он читал одну строку за раз.время для обработки, прежде чем читать в следующей строке.Кажется, из всей документации следует, что файл CSV всегда полностью читается в память, и это то, чего я хочу избежать.

Нужно ли использовать обратные вызовы?Если так, как я могу быть уверен, что ресурс потока читается только по одной строке за раз, а не все сразу?

Я предполагаю, что я начинаю с создания средства чтения потоков?

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

1 Ответ

0 голосов
/ 16 октября 2018

Вы можете перебирать строки без загрузки всего файла, используя IteratorAggregate интерфейс Reader.Таким образом, вы в основном просто делаете

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

Если вы используете Mac для чтения или создания CSV-файла, вам нужно добавить это в свой код, чтобы он работал правильно:

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