Как читать большой файл построчно?
Я хочу прочитать файл построчно, не загружая его полностью в память.
Размер моего файла составляет 1 ГБ, и если я пытаюсь открыть его целиком, я постоянно получаю ошибки исчерпания памяти. Как можно решить эту проблему?
5 ответ(ов)
Вы можете использовать функцию fgets()
для чтения файла построчно:
$handle = fopen("inputfile.txt", "r");
if ($handle) {
while (($line = fgets($handle)) !== false) {
// обработка считанной строки.
}
fclose($handle);
}
В этом коде мы сначала открываем файл с помощью fopen()
в режиме чтения ("r"). Если файл успешно открыт, мы запускаем цикл, который будет считывать файл построчно с помощью fgets()
. Каждая считанная строка может быть обработана в теле цикла. После завершения чтения не забудьте закрыть файл с помощью fclose()
.
Ваш код открывает файл file.txt
для чтения, а затем считывает его построчно до конца файла. Вот переведенный код с комментариями на русском языке:
if ($file = fopen("file.txt", "r")) { // Открываем файл file.txt для чтения
while(!feof($file)) { // Пока не достигнут конец файла
$line = fgets($file); // Считываем строку из файла
// Обрабатываем строку $line
}
fclose($file); // Закрываем файл после завершения чтения
}
Таким образом, код читает файл построчно, пока не достигнет конца, и не забудьте закрыть файл после завершения работы с ним.
Вы можете использовать объектно-ориентированный интерфейс класс для работы с файлами, который называется 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
, чтобы корректно освободить ресурсы, связанные с открытым файлом.
Если вы хотите использовать 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 и выше.
В PHP есть функция file()
, которая возвращает массив строк, содержащихся в указанном файле. Вы можете использовать её для чтения содержимого файла построчно. Вот пример, как это сделать:
foreach (file('myfile.txt') as $line) {
echo $line . "\n";
}
В этом коде file('myfile.txt')
считывает все строки из файла myfile.txt
и возвращает их в виде массива. Мы используем цикл foreach
, чтобы пройтись по каждой строке массива и вывести её на экран, добавляя перевод строки после каждой строки из файла. Если у вас есть дополнительные вопросы или нужны пояснения, не стесняйтесь задавать!
UTF-8 на всех уровнях!
Сортировка двумерного массива по значению в столбце
Что такое потокобезопасность и непотокобезопасность в PHP?
Как передать переменные и данные из PHP в JavaScript?
Вставка нового элемента в массив в любом месте в PHP