Проблема с получением последнего чанка в цикле while - PullRequest
0 голосов
/ 30 марта 2020

Так что прошло какое-то время с тех пор, как я сделал PHP, и, честно говоря, этот вопрос кажется глупым. Но моя голова просто застряла, думая о том, как получить последний кусок в файле.

Мой пока l oop читает файл построчно, и после 10 строк он должен выполнять код. Проблема возникает, когда есть 51 линия. Как мне добраться до последней строки?

Размер файла превышает 300 МБ, поэтому я не могу загрузить его в память (массив).

while ($row = fgets($handle))
{
    $chunk[] = array_combine($feed_product_arraykeys, explode("\t", $row));

    if(count($chunk) == 10)
    {
        echo count($chunk) . '<br>';

        // Initiate code

        unset($chunk);
    }
}

С наилучшими пожеланиями

Ответы [ 2 ]

3 голосов
/ 30 марта 2020

Вот альтернативный способ. Просто прочитайте файл в массив и разбейте его на куски по 10 штук. Остальные будут в последнем кусочке:

foreach(array_chunk(file('/path/to/file'), 10) as $row) {
    $chunk[] = array_combine($feed_product_arraykeys, explode("\t", $row));

    echo count($chunk) . '<br>';
}
0 голосов
/ 30 марта 2020

Так что я на самом деле исправил это, посчитав количество строк в файле. Я думал, что это будет медленно, но на самом деле это быстро, даже на 300-мегабайтном файле со 130 тыс. Строк.

// Count number of lines in feed
$feed_row_count = count_lines_in_file("tmp/56.csv");

$row_counter = 0;
$feed_handle = fopen("tmp/56.csv", "r");
while ($row = fgets($feed_handle))
{
    $row_counter++;

    $chunk[] = array_combine($feed_product_arraykeys, explode("\t", $row));

    if(count($chunk) == 25 || $feed_row_count == $row_counter)
    {
        echo count($chunk) . '<br>';

        // Initiate SQL

        unset($chunk);
    }
}
...