PHP: чтение определенной строки из файла - PullRequest
52 голосов
/ 25 апреля 2011

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

foo  
foo2

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

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

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

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

Ответы [ 12 ]

81 голосов
/ 25 апреля 2011
$myFile = "4-24-11.txt";
$lines = file($myFile);//file in to an array
echo $lines[1]; //line 2

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

30 голосов
/ 06 июля 2015

omg ​​ Мне не хватает 7 представителей, чтобы комментировать.Это комментарий @ Raptor & @ Tomm, так как этот вопрос все еще обнаруживается в Google Serps.

Он совершенно прав.Для небольших файлов 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, поэтому он не является репрезентативным для производстваокружающей среды, но все же ... большая разница.

16 голосов
/ 25 апреля 2011

Если вы хотите сделать это таким образом ...

$line = 0;

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

В качестве альтернативы, откройте его с помощью file() и подпишите строку с помощью [1].

11 голосов
/ 26 февраля 2016

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

$file = new SplFileObject("filename");
if (!$file->eof()) {
     $file->seek($lineNumber);
     $contents = $file->current(); // $contents would hold the data from line x
}
9 голосов
/ 25 апреля 2011

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

$handle = @fopen('test.txt', "r");

if ($handle) { 
   while (!feof($handle)) { 
       $lines[] = fgets($handle, 4096); 
   } 
   fclose($handle); 
} 


print_r($lines);

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

6 голосов
/ 25 апреля 2011
$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);
3 голосов
/ 12 октября 2015

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

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

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

2 голосов
/ 25 апреля 2011

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

  while(!feof($file))
  {
     echo fgets($file). "<br />";
  }
  fclose($file);
1 голос
/ 19 декабря 2016

Этот вопрос довольно старый, но для тех, кто имеет дело с очень большими файлами, здесь есть решение, которое не включает чтение каждой предыдущей строки. Это было также единственным решением, которое работало в моем случае для файла с ~ 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
?>

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

1 голос
/ 28 ноября 2015

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

$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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...