Вы должны использовать fgets()без $lengthпараметра.
Карлос
26
Хотели бы вы отметить как ответ на любой из следующих?
Ким Стеки
Ответы:
685
Вы можете использовать fgets()функцию для чтения файла построчно:
$handle = fopen("inputfile.txt","r");if($handle){while(($line = fgets($handle))!==false){// process the line read.}
fclose($handle);}else{// error opening the file.}
Как этот счет для too large to open in memoryчасти?
Starx
64
Вы не читаете весь файл в памяти. Максимальный объем памяти, необходимый для запуска, зависит от самой длинной строки на входе.
codaddict
13
@Brandin - Moot - В этих ситуациях заданный вопрос, который заключается в чтении файла LINE BY LINE, не имеет четко определенного результата.
ToolmakerSteve
3
@ToolmakerSteve Тогда определите, что должно произойти. Если вы хотите, вы можете просто напечатать сообщение «Строка слишком длинная; сдача». и это тоже четко определенный результат.
Брандин
2
Может ли строка содержать логическое значение false? Если это так, то этот метод остановится, не достигнув конца файла. Пример №1 на этом URL php.net/manual/en/function.fgets.php предполагает, что fgets иногда может возвращать логическое значение false, даже если конец файла еще не достигнут. В разделе комментариев на этой странице люди сообщают, что fgets () не всегда возвращает правильные значения, поэтому безопаснее использовать feof в качестве условного цикла.
cjohansson
131
if($file = fopen("file.txt","r")){while(!feof($file)){
$line = fgets($file);# do same stuff with the $line}
fclose($file);}
<?php
$file =newSplFileObject("file.txt");// Loop until we reach the end of the file.while(!$file->eof()){// Echo one line from the file.
echo $file->fgets();}// Unset the file to call __destruct(), closing the file handle.
$file =null;
Спасибо. Да, например, вы можете добавить эту строку раньше, пока $ file-> setFlags (SplFileObject :: DROP_NEW_LINE); для того, чтобы сбросить символы новой строки в конце строки.
elshnkhll
Насколько я вижу, нет eof()функции в SplFileObject?
Chud37
3
Спасибо! Кроме того, используйте rtrim($file->fgets())для удаления завершающих строк новой строки для каждой строки, которая читается, если вы не хотите их.
Это должен быть принятый ответ. Это в сто раз быстрее с генераторами.
Тачи
1
И ваааааааа более эффективная память.
Нино Шкопац
2
@ NinoŠkopac: Можете ли вы объяснить, почему это решение более эффективно использует память? Например, по сравнению с SplFileObjectподходом.
k00ni
30
Используйте методы буферизации для чтения файла.
$filename ="test.txt";
$source_file = fopen( $filename,"r")ordie("Couldn't open $filename");while(!feof($source_file)){
$buffer = fread($source_file,4096);// use a buffer of 4KB
$buffer = str_replace($old,$new,$buffer);///}
это заслуживает большей любви, так как будет работать с огромными файлами, даже с файлами, у которых нет возврата каретки или слишком длинных строк ...
Джиммери
Я не был бы удивлен, если бы OP действительно не заботился о реальных строках и просто хотел, например, подать загрузку. В этом случае этот ответ очень хорош (и то, что в любом случае сделает большинство PHP-кодеров).
Альваро Гонсалес
30
Есть file()функция, которая возвращает массив строк, содержащихся в файле.
Все файлы объемом один ГБ будут считаны в память и преобразованы в массив размером более одного ГБ ... удачи.
FrancescoMM
4
Это был не ответ на заданный вопрос, но он отвечает на более распространенный вопрос, который возникает у многих людей при поиске здесь, так что это все равно было полезно, спасибо.
Pilavdzice
2
file () очень удобен для работы с небольшими файлами. Особенно, когда вы хотите массив () в качестве конечного результата.
functionvoid
это плохая идея с большими файлами, так как весь файл читается в массив сразу
Flash Thunder
Это плохо работает с большими файлами, поэтому именно этот метод не работает.
Следует отметить, что этот код будет возвращать только строки до появления первой пустой строки. Вам нужно проверить на $ line! == false в состоянии whilewhile (($line = stream_get_line($fp, 1024 * 1024, "\n")) !== false)
cebe
8
Будьте осторожны с вещами 'while (! Feof ... fgets ()'), fgets может получить ошибку (returnfing false) и зацикливаться вечно, не доходя до конца файла. Codaddict был наиболее близок к правильному, но когда ваш 'while fgets' цикл заканчивается, проверьте feof, если не соответствует истине, то произошла ошибка.
Вот как я справляюсь с очень большими файлами (проверено до 100G). И это быстрее, чем fgets ()
$block =1024*1024;//1MB or counld be any higher than HDD block_size*2if($fh = fopen("file.txt","r")){
$left='';while(!feof($fh)){// read the file
$temp = fread($fh, $block);
$fgetslines = explode("\n",$temp);
$fgetslines[0]=$left.$fgetslines[0];if(!feof($fh))$left = array_pop($lines);foreach($fgetslines as $k => $line){//do smth with $line}}}
fclose($fh);
function read_file($filename =''){
$buffer = array();
$source_file = fopen( $filename,"r")ordie("Couldn't open $filename");while(!feof($source_file)){
$buffer[]= fread($source_file,4096);// use a buffer of 4KB}return $buffer;}
Это позволило бы создать один массив объемом более одного ГБ в памяти (удачи с ним), разделенный даже не на строки, а на произвольные 4096 символов. С какой стати вы хотите это сделать?
fgets()
без$length
параметра.Ответы:
Вы можете использовать
fgets()
функцию для чтения файла построчно:источник
too large to open in memory
части?источник
if($file)
до цикла whilefeof()
больше не существует?Вы можете использовать класс объектно-ориентированного интерфейса для файла - SplFileObject http://php.net/manual/en/splfileobject.fgets.php (PHP 5> = 5.1.0)
источник
eof()
функции в SplFileObject?rtrim($file->fgets())
для удаления завершающих строк новой строки для каждой строки, которая читается, если вы не хотите их.Если вы открываете большой файл, вы, вероятно, захотите использовать Generators вместе с fgets (), чтобы избежать загрузки всего файла в память:
Используйте это так:
Таким образом, вы можете обрабатывать отдельные строки файла внутри foreach ().
Примечание: генераторы требуют> = PHP 5.5
источник
SplFileObject
подходом.Используйте методы буферизации для чтения файла.
источник
Есть
file()
функция, которая возвращает массив строк, содержащихся в файле.источник
источник
file()
.Очевидного ответа не было во всех ответах.
В PHP имеется удобный анализатор потокового разделителя, созданный именно для этой цели.
источник
while (($line = stream_get_line($fp, 1024 * 1024, "\n")) !== false)
Будьте осторожны с вещами 'while (! Feof ... fgets ()'), fgets может получить ошибку (returnfing false) и зацикливаться вечно, не доходя до конца файла. Codaddict был наиболее близок к правильному, но когда ваш 'while fgets' цикл заканчивается, проверьте feof, если не соответствует истине, то произошла ошибка.
источник
Вот как я справляюсь с очень большими файлами (проверено до 100G). И это быстрее, чем fgets ()
источник
Одно из популярных решений этого вопроса будет иметь проблемы с символом новой строки. Это можно легко исправить с помощью простого
str_replace
.источник
SplFileObject полезен, когда речь идет о работе с большими файлами.
источник
источник
Функция для чтения с возвратом массива
источник