2012-02-21 4 views
5

Я работаю над чтением файла в php. Мне нужно прочитать определенные строки файла.Чтение определенной строки файла в PHP

Я использовал этот код:

fseek($file_handle,$start); 
while (!feof($file_handle)) 
{ 
    ///Get and read the line of the file pointed at. 
    $line = fgets($file_handle); 
    $lineArray .= $line."LINE_SEPARATOR"; 

    processLine($lineArray, $linecount, $logger, $xmlReply); 

    $counter++; 
} 
fclose($file_handle); 

Однако я понял, что fseek() занимает количество байтов, а не номер строки.

Есть ли у PHP другая функция, которая основывает свой указатель на строках?

Или мне нужно читать файл с самого начала каждый раз и иметь счетчик , пока не будет прочитан мой номер нужной строки?

Я ищу эффективный алгоритм, перешагнув более 500-1000 Кбайт файла, чтобы добраться до нужной строки, кажется неэффективным.

ответ

11

Использование SplFileObject::seek

$file = new SplFileObject('yourfile.txt'); 
$file->seek(123); // seek to line 124 (0-based) 
+0

спасибо @JRL, но ищет, основывается на байтах? и не номер строки? – tinks

+0

спасибо @JRL, я думаю, что мне нужно :) – tinks

+0

Использование splfileobject делает не дают функции fopen дает. Есть ли простой способ превратить этот объект в ресурс fopen? – Madmenyo

1

Вы должны прочитать с самого начала. Но если файл никогда/редко изменяется, вы можете кэшировать смещения строк где-то еще, возможно, в другом файле.

+0

что вы имеете в виду кэш корректоры? когда я снова вызову файл, я могу перейти непосредственно к оставшимся строкам, которые мне нужно прочитать? @ Игнасио Васкес-Абрамс? – tinks

1

Попробуйте это самое простого

$buffer=explode("\n",file_get_contents("filename"));//Split data to array for each "\n" 

Теперь буфер представляет собой массив, и каждый индекс массива содержат каждые строки; Получить 5-ю строку

echo $buffer[4]; 
+0

спасибо Akhil, но я читаю очень файл с файлами. – tinks

9

Это работает для вас?

$file = "name-of-my-file.txt"; 
$lines = file($file); 
echo $lines[67]; // echos line 68 (lines numbers start at 0 (replace 68 with whatever)) 

Вам, очевидно, потребуется проверить линии, существующие до печати. Любой хороший?

+0

спасибо @ ярким цветам, но потому что я читаю большой файл, например, logfiles :(Мне нужно прочитать первые 100, а затем следующий только onScroll..so, хотя я знаю, что строка, чтобы читать из следующего im, глядя на то, как читать прямо в строке. – tinks

0

Вы можете использовать функцию file($filename). Эта функция считывает данные из файла в массив.

2

Вы могли бы сделать так:

$lines = file($filename); //file in to an array 
echo $lines[1];   //line 2 

ИЛИ

$line = 0; 
$fh = fopen($myFile, 'r'); 

while (($buffer = fgets($fh)) !== FALSE) { 
    if ($line == 1) { 
     // $buffer is the second line. 
     break; 
    } 
    $line++; 
} 
Смежные вопросы