[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: фрагментарное чтение файла
LRCenter
Собственно, возможно ли прочитать в память строки по диапазону номеров, например 100-150?

Именно сразу прочитать, не расходуя лишних памяти и времени, а не прочитать все в массив, а затем отсеять нужное.



Спустя 6 минут, 33 секунды (1.03.2011 - 15:45) linker написал(а):
Конечно, в цикле.
fopen()
while(){}
fclose()

Спустя 29 минут, 24 секунды (1.03.2011 - 16:14) LRCenter написал(а):
linker

Не понял. Как передать номер строки в fgets() внутри цикла?
У этой функции нет такого параметра.

В документации есть пример, но там прочитываются все строки до конца файла:


$handle = fopen("/tmp/inputfile.txt", "r");
while (!feof($handle)) {
$buffer = fgets($handle, 4096);
echo $buffer;
}
fclose($handle);


Спустя 3 минуты, 49 секунд (1.03.2011 - 16:18) Snus написал(а):
LRCenter
А ты логически подумай. Ты сможешь узнать сколько конфет в коробке, не открыв ее и не подсчитав кол-во? Ответ - нет. Тут ситуация такая же.

Спустя 2 минуты, 34 секунды (1.03.2011 - 16:21) T1grOK написал(а):
Может на коробке написано, сколько в ней конфет. rolleyes.gif

Спустя 2 минуты, 35 секунд (1.03.2011 - 16:23) LRCenter написал(а):
Snus
И я так думаю.
Вроде очень четко вопрос сформулировал, linker что ли меня неправильно понял, раз написал что возможно.

Хотя, может знает какое-нибудь решение. Подождем его.

Спустя 55 секунд (1.03.2011 - 16:24) LRCenter написал(а):
T1grOK
А если я запрашиваю конфету которой нет, может вернется пустой запрос или false. Почему нет?

Спустя 1 минута, 34 секунды (1.03.2011 - 16:26) Snus написал(а):
T1grOK
Даже если написано, сунуть туда вслепую руку и вытащить конфеты под номером 1, 2 и 3 будет тяжело wink.gif)

Спустя 6 минут, 16 секунд (1.03.2011 - 16:32) LRCenter написал(а):
Snus
Вообще-то да, разделитель строк пренадлежит к концу старой строки а не к началу новой, чтоб определить начало новой строки нужно прочитать предидущую всю до конца sad.gif

Спустя 1 минута, 29 секунд (1.03.2011 - 16:34) linker написал(а):
LRCenter
Snus тебе правильно аналогию сказал. Открой матчасть и почитай что такое файл. Набор байтов. Ну не понимает файл такого понятия как строки. Ты сам должен считать.
$handler = fopen('file.txt', 'r');
$start = 100;
$end = 150;
$position = 0;
while (!feof($handler))
{
$str = fgets($handler, 4096);
if ($position >= $start && $position <= $end)
echo $str;
++
$position;
}
fclose($handler);

Спустя 1 минута, 55 секунд (1.03.2011 - 16:36) Snus написал(а):
linker
++ $position; ? = $position++; ?

Спустя 37 секунд (1.03.2011 - 16:36) linker написал(а):
++ $position работает быстрее smile.gif

Спустя 1 минута, 24 секунды (1.03.2011 - 16:38) Snus написал(а):
linker
Надо устроить тест biggrin.gif

Спустя 1 минута, 56 секунд (1.03.2011 - 16:40) linker написал(а):
Snus
Не надо это факт. ++ $position сразу будет инкремент, $position ++ только на следующем шаге интерпретации, а это лишнее затрачиваемое время.

Спустя 2 минуты, 17 секунд (1.03.2011 - 16:42) Snus написал(а):
linker
Я уже проверил. ++ $val в 2 раза быстрее $val++ ! Не знал, не буду лукавить smile.gif

Спустя 1 минута, 46 секунд (1.03.2011 - 16:44) linker написал(а):
Snus
smile.gif проверяльщик заядлый smile.gif

Спустя 43 секунды (1.03.2011 - 16:44) Snus написал(а):
linker
Доверяй, но проверяй! wink.gif

Спустя 12 минут, 12 секунд (1.03.2011 - 16:56) LRCenter написал(а):
Это уличная магия какая-то, честное слово! ohmy.gif
Так и жду что linker скажет мне в следующий раз: "вытащи у себя из-за шиворота учебник по php с моим автографом" ))

Настолько просто и эффективно! Замерил на здоровом файле в 10 метров расход памяти копеечный по сравнению с перекладыванием в массив.

linker
Блин, моё почтение!

Переписать строку в файле с такой же эффективностью, конечно-же из области фантастики?

Спустя 6 минут, 12 секунд (1.03.2011 - 17:03) linker написал(а):
Ну я бы не сказал, что из области фантастики, но жонглирование временными файлами обеспечено (если не хочешь расходовать память).

Спустя 9 минут, 45 секунд (1.03.2011 - 17:12) LRCenter написал(а):
В смысле, "слив" двух диапазонов строк(с игнорированием перезаписываемой строки) в два отдельных файла, затем дозапись нужной строки к первому, потом второго сверху и переименование с удалением оригинала?

Спустя 7 минут, 33 секунды (1.03.2011 - 17:20) linker написал(а):
Да, как-то так.

Спустя 57 минут, 22 секунды (1.03.2011 - 18:17) LRCenter написал(а):
Спасибо, возьму на заметку.

Чтение заданного диапазона строк с конца файла реализовал так:

$handler=fopen('test2.csv', 'r');

$conuter = 0;
while (!feof($handler)){
$str=fgets($handler);
++
$conuter;}

fclose($handler);

$conuter--;

$handler=fopen('test2.csv', 'r');
$start = $conuter - 3;
$end = $conuter - 2;
$position = 0;
while(!feof($handler))
{
$str = fgets($handler);
if ($position >= $start && $position <= $end)
echo $str."<br><hr>";
++
$position;
}
fclose($handler);



Рационально?

Спустя 15 часов, 19 минут, 56 секунд (2.03.2011 - 09:37) linker написал(а):
Есть другой вариант, перелить с заменой в другой файл, а потом rename().

Спустя 1 минута, 24 секунды (2.03.2011 - 09:39) LRCenter написал(а):
linker
Это как, не понял?


_____________
Меньше кода - меньше багов ©
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.