6

Как читать большой файл построчно?

12

Я хочу прочитать файл построчно, не загружая его полностью в память.

Размер моего файла составляет 1 ГБ, и если я пытаюсь открыть его целиком, я постоянно получаю ошибки исчерпания памяти. Как можно решить эту проблему?

5 ответ(ов)

8

Вы можете использовать функцию fgets() для чтения файла построчно:

$handle = fopen("inputfile.txt", "r");
if ($handle) {
    while (($line = fgets($handle)) !== false) {
        // обработка считанной строки.
    }

    fclose($handle);
}

В этом коде мы сначала открываем файл с помощью fopen() в режиме чтения ("r"). Если файл успешно открыт, мы запускаем цикл, который будет считывать файл построчно с помощью fgets(). Каждая считанная строка может быть обработана в теле цикла. После завершения чтения не забудьте закрыть файл с помощью fclose().

1

Ваш код открывает файл file.txt для чтения, а затем считывает его построчно до конца файла. Вот переведенный код с комментариями на русском языке:

if ($file = fopen("file.txt", "r")) { // Открываем файл file.txt для чтения
    while(!feof($file)) { // Пока не достигнут конец файла
        $line = fgets($file); // Считываем строку из файла
        // Обрабатываем строку $line
    }
    fclose($file); // Закрываем файл после завершения чтения
}

Таким образом, код читает файл построчно, пока не достигнет конца, и не забудьте закрыть файл после завершения работы с ним.

1

Вы можете использовать объектно-ориентированный интерфейс класс для работы с файлами, который называется SplFileObject. Данный класс доступен с версии PHP 5.1.0. В примере ниже показано, как читать файл построчно:

<?php

$file = new SplFileObject("file.txt");

// Цикл, который продолжается, пока не достигнем конца файла.
while (!$file->eof()) {
    // Выводим одну строку из файла.
    echo $file->fgets();
}

// Устанавливаем $file в null, чтобы вызвать __destruct(), закрывая дескриптор файла.
$file = null;

Этот код создает объект SplFileObject, который позволяет удобно работать с файлами. Метод fgets() используется для чтения строк из файла, а метод eof() помогает определить, достигнут ли конец файла. Не забудьте установить объект в null, чтобы корректно освободить ресурсы, связанные с открытым файлом.

1

Если вы хотите использовать foreach вместо while при открытии большого файла, вам, вероятно, стоит инкапсулировать цикл while внутри генератора, чтобы избежать загрузки всего файла в память:

/**
 * @return Generator
 */
$fileData = function() {
    $file = fopen(__DIR__ . '/file.txt', 'r');

    if (!$file) {
        return; // die() - плохая практика, лучше использовать return
    }    
    while (($line = fgets($file)) !== false) {
        yield $line;
    }

    fclose($file);
};

Используйте его так:

foreach ($fileData() as $line) {
    // $line содержит текущую строку
}

Таким образом, вы сможете обрабатывать отдельные строки файла внутри foreach().

Примечание: Генераторы требуют PHP версии 5.5 и выше.

0

В PHP есть функция file(), которая возвращает массив строк, содержащихся в указанном файле. Вы можете использовать её для чтения содержимого файла построчно. Вот пример, как это сделать:

foreach (file('myfile.txt') as $line) {
    echo $line . "\n";
}

В этом коде file('myfile.txt') считывает все строки из файла myfile.txt и возвращает их в виде массива. Мы используем цикл foreach, чтобы пройтись по каждой строке массива и вывести её на экран, добавляя перевод строки после каждой строки из файла. Если у вас есть дополнительные вопросы или нужны пояснения, не стесняйтесь задавать!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь