PHP: чтение конкретной строки из файла

Я пытаюсь прочитать определенную строку из текстового файла, используя php. Вот текстовый файл:

foo foo2 

Как получить содержимое второй строки с помощью php? Это возвращает первую строку:

 <?php $myFile = "4-24-11.txt"; $fh = fopen($myFile, 'r'); $theData = fgets($fh); fclose($fh); echo $theData; ?> 

.. но мне нужно второе.

Любая помощь будет принята с благодарностью

 $myFile = "4-24-11.txt"; $lines = file($myFile);//file in to an array echo $lines[1]; //line 2 

file – считывает весь файл в массив

Если бы вы хотели сделать это так …

 $line = 0; while (($buffer = fgets($fh)) !== FALSE) { if ($line == 1) { // This is the second line. break; } $line++; } 

Кроме того, откройте его с помощью file() и подстройте строку с помощью [1] .

omg Мне не хватает 7 отзывов, чтобы комментировать. Это комментарий @ Raptor & @ Tomm, так как этот вопрос по-прежнему обнаруживает высокий уровень в google-серпах.

Он прав. Для file($file); небольших файлов file($file); отлично. Для больших файлов это полный избыток b / c php-массивов питает память, как сумасшедшую.

Я просто провел крошечный тест с * .csv с размером файла ~ 67 мб (1 000 000 строк):

 $t = -microtime(1); $file = '../data/1000k.csv'; $lines = file($file); echo $lines[999999] ."\n".(memory_get_peak_usage(1)/1024/1024) ."\n".($t+microtime(1)); //227.5 //0.22701287269592 //Process finished with exit code 0 

И так как никто еще не упомянул об этом, я дал попробовать SplFileObject , который я на самом деле недавно открыл для себя.

 $t = -microtime(1); $file = '../data/1000k.csv'; $spl = new SplFileObject($file); $spl->seek(999999); echo $spl->current() ."\n".(memory_get_peak_usage(1)/1024/1024) ."\n".($t+microtime(1)); //0.5 //0.11500692367554 //Process finished with exit code 0 

Это было на моем рабочем столе Win7, поэтому оно не является репрезентативным для производственной среды, но все-таки … в этом разница.

вы можете использовать следующее, чтобы получить все строки в файле

 $handle = @fopen('test.txt', "r"); if ($handle) { while (!feof($handle)) { $lines[] = fgets($handle, 4096); } fclose($handle); } print_r($lines); 

и $lines[1] для вашей второй линии

 $myFile = "4-21-11.txt"; $fh = fopen($myFile, 'r'); while(!feof($fh)) { $data[] = fgets($fh); //Do whatever you want with the data in here //This feeds the file into an array line by line } fclose($fh); в $myFile = "4-21-11.txt"; $fh = fopen($myFile, 'r'); while(!feof($fh)) { $data[] = fgets($fh); //Do whatever you want with the data in here //This feeds the file into an array line by line } fclose($fh); 

Я бы использовал класс SplFileObject …

 $file = new SplFileObject("filename"); if (!$file->eof()) { $file->seek($lineNumber); $contents = $file->current(); // $contents would hold the data from line x } 

Если вы используете PHP в Linux, вы можете попробовать следующее, чтобы прочитать текст, например, между 74-й и 159-й строками:

 $text = shell_exec("sed -n '74,159p' path/to/file.log"); 

Это решение хорошо, если ваш файл большой.

Вы должны зацикливать файл до конца файла.

  while(!feof($file)) { echo fgets($file). "<br />"; } fclose($file); в  while(!feof($file)) { echo fgets($file). "<br />"; } fclose($file); 

Использовать stream_get_line: stream_get_line – Получает строку из ресурса потока до заданного разделителя Источник: http://php.net/manual/en/function.stream-get-line.php

Вы можете попробовать выполнить цикл до нужной строки, а не EOF, и каждый раз возвращать переменную в строку (не добавляя к ней). В вашем случае вторая строка – EOF. (Возможно, в моем коде ниже подходит цикл «А»).

Таким образом, весь файл не находится в памяти; недостаток – это время, чтобы пройти через файл до нужной вам точки.

 <?php $myFile = "4-24-11.txt"; $fh = fopen($myFile, 'r'); $i = 0; while ($i < 2) { $theData = fgets($fh); $i++ } fclose($fh); echo $theData; ?> 

Мне нравится ответ daggett, но есть еще одно решение, которое вы можете попробовать, если ваш файл недостаточно велик.

 $file = __FILE__; // Let's take the current file just as an example. $start_line = __LINE__ -1; // The same with the line what we look for. Take the line number where $line variable is declared as the start. $lines_to_display = 5; // The number of lines to display. Displays only the $start_line if set to 1. If $lines_to_display argument is omitted displays all lines starting from the $start_line. echo implode('', array_slice(file($file), $start_line, lines_to_display)); 

Этот вопрос довольно старый, но для тех, кто имеет дело с очень большими файлами, вот решение, которое не связано с чтением каждой предыдущей строки. Это было единственное решение, которое работало в моем случае для файла с ~ 160 миллионами строк.

 <?php function rand_line($fileName) { do{ $fileSize=filesize($fileName); $fp = fopen($fileName, 'r'); fseek($fp, rand(0, $fileSize)); $data = fread($fp, 4096); // assumes lines are < 4096 characters fclose($fp); $a = explode("\n",$data); }while(count($a)<2); return $a[1]; } echo rand_line("file.txt"); // change file name ?> в <?php function rand_line($fileName) { do{ $fileSize=filesize($fileName); $fp = fopen($fileName, 'r'); fseek($fp, rand(0, $fileSize)); $data = fread($fp, 4096); // assumes lines are < 4096 characters fclose($fp); $a = explode("\n",$data); }while(count($a)<2); return $a[1]; } echo rand_line("file.txt"); // change file name ?> 

Он работает, открывая файл, не читая ничего, затем мгновенно перемещая указатель в произвольную позицию, считывая до 4096 символов с этой точки, а затем захватывая первую полную строку из этих данных.