Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Получить последнюю строку файла
Форумы портала PHP.SU » » Вопросы новичков » Получить последнюю строку файла

Страниц (3): [1] 2 3 »
 

1. soleg - 20 Октября, 2013 - 19:12:05 - перейти к сообщению
Всем привет.
В общем есть файлик весит, который около 6ГБ (около 200кк строк).
Как максимально быстро получить последнюю строку файла?
2. OrmaJever - 20 Октября, 2013 - 19:24:34 - перейти к сообщению
размер строк хотя бы примерно известен?
3. LIME - 20 Октября, 2013 - 19:32:30 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $handle = fopen("c:\\folder\\resource.txt", "a");

и потом http://www.php.net/manual/ru/function.fseek.php с отр. значением смещения пока не встретишь перенос строки
4. soleg - 20 Октября, 2013 - 19:34:24 - перейти к сообщению
OrmaJever пишет:
размер строк хотя бы примерно известен?


39-45

строки такого вида
PHP:
скопировать код в буфер обмена
  1.  
  2. XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX
  3.  
5. armancho7777777 - 20 Октября, 2013 - 19:41:52 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1.  
  2. $fp = fopen($fileName, 'r');
  3. $offset = -4096;
  4. fseek($fp, $offset, SEEK_END);
  5. $data = fgets($fp, 4096);

SEEK_END - Устанавливает смещение в конец файла плюс $offset.
6. LIME - 20 Октября, 2013 - 19:45:01 - перейти к сообщению
armancho7777777 а почему именно такое значение смещения
я бы по одному байту сикал и накапливал
а как иначе?
7. armancho7777777 - 20 Октября, 2013 - 19:54:48 - перейти к сообщению
Ну так, от фанаря ))
Ну конечно посимвольно читать.
fgetc
8. LIME - 20 Октября, 2013 - 19:58:44 - перейти к сообщению
хотя если примерно известны размеры строк быстрее будет установить смещение заведоме больше чем максимальная длина строки
и читать построчно
fgets
9. armancho7777777 - 20 Октября, 2013 - 20:05:37 - перейти к сообщению
Примерно - не дело.
10. LIME - 20 Октября, 2013 - 20:13:23 - перейти к сообщению
armancho7777777 почему?
если строка от 20 до 30 символов то проще установить смещение на -30 и считать 2 строки если первая же не достигла конца файла
(Добавление)
soleg пишет:
39-45
как раз этот случай
11. armancho7777777 - 20 Октября, 2013 - 20:35:28 - перейти к сообщению
armancho7777777 пишет:
от 20 до 30 символов

А если 45 ?
А если 450 ?
(Добавление)
PHP:
скопировать код в буфер обмена
  1.  
  2. /**
  3. * Функция возвращает строки с конца файла.
  4. *
  5. * @param string $file Имя файла.
  6. * @param int $size Количество строк.
  7. */
  8. function getEndLines($file, $size = 1)
  9. {
  10.         if(!filesize($file))
  11.         return '';
  12.  
  13.         $fp = fopen($file, 'r');
  14.         $char = $line = '';
  15.         $pos = -1;
  16.         $lineSize = $strlen = 0;
  17.  
  18.         $size = (int) $size;
  19.         if(!$size) $size = 1;
  20.        
  21.         while(!$strlen || $lineSize < $size)
  22.         {
  23.                 fseek($fp, $pos, SEEK_END);
  24.                 $char = fgetc($fp);
  25.                 $line = $char . $line;
  26.                 $strlen = strlen(trim($line));
  27.                 $pos--;
  28.  
  29.                 if($strlen && $char == "\n")
  30.                 $lineSize++;
  31.         }
  32.  
  33.         fclose($fp);
  34.         return $line;
  35. }
  36.  
  37. echo getEndLines('file.txt');
  38.  
12. tuareg - 20 Октября, 2013 - 20:56:23 - перейти к сообщению
armancho7777777 А PHP_EOL нельзя использовать вместо
PHP:
скопировать код в буфер обмена
  1.  
  2. ($char == "\r\n" || $char == "\n")
  3.  

?
13. teddy - 20 Октября, 2013 - 21:03:50 - перейти к сообщению
Могу предложить
PHP:
скопировать код в буфер обмена
  1. $file = explode(PHP_EOL, file_get_contents("text.txt"));
  2. echo $file[count($file) -1];
14. armancho7777777 - 20 Октября, 2013 - 21:06:19 - перейти к сообщению
tuareg пишет:
А PHP_EOL нельзя использовать вместо

Опечатался.
В винде 2 символа в PHP_EOL.

teddy
soleg пишет:
есть файлик весит, который около 6ГБ
15. SAD - 20 Октября, 2013 - 21:20:56 - перейти к сообщению
а не проще ее хранить в отдельном файле? и перезаписывать

 

Powered by ExBB FM 1.0 RC1