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

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

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
soleg
Отправлено: 20 Октября, 2013 - 19:12:05
Post Id


Гость


Покинул форум
Сообщений всего: 71
Дата рег-ции: Окт. 2011  


Помог: 3 раз(а)




Всем привет.
В общем есть файлик весит, который около 6ГБ (около 200кк строк).
Как максимально быстро получить последнюю строку файла?
 
 Top
OrmaJever Модератор
Отправлено: 20 Октября, 2013 - 19:24:34
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




размер строк хотя бы примерно известен?


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
LIME
Отправлено: 20 Октября, 2013 - 19:32:30
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




PHP:
скопировать код в буфер обмена
  1. $handle = fopen("c:\\folder\\resource.txt", "a");

и потом http://www.php.net/manual/ru/function.fseek.php с отр. значением смещения пока не встретишь перенос строки
 
 Top
soleg
Отправлено: 20 Октября, 2013 - 19:34:24
Post Id


Гость


Покинул форум
Сообщений всего: 71
Дата рег-ции: Окт. 2011  


Помог: 3 раз(а)




OrmaJever пишет:
размер строк хотя бы примерно известен?


39-45

строки такого вида
PHP:
скопировать код в буфер обмена
  1.  
  2. XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX
  3.  
 
 Top
armancho7777777 Супермодератор
Отправлено: 20 Октября, 2013 - 19:41:52
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




PHP:
скопировать код в буфер обмена
  1.  
  2. $fp = fopen($fileName, 'r');
  3. $offset = -4096;
  4. fseek($fp, $offset, SEEK_END);
  5. $data = fgets($fp, 4096);

SEEK_END - Устанавливает смещение в конец файла плюс $offset.

(Отредактировано автором: 20 Октября, 2013 - 19:44:01)

 
 Top
LIME
Отправлено: 20 Октября, 2013 - 19:45:01
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




armancho7777777 а почему именно такое значение смещения
я бы по одному байту сикал и накапливал
а как иначе?
 
 Top
armancho7777777 Супермодератор
Отправлено: 20 Октября, 2013 - 19:54:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Ну так, от фанаря ))
Ну конечно посимвольно читать.
fgetc
 
 Top
LIME
Отправлено: 20 Октября, 2013 - 19:58:44
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




хотя если примерно известны размеры строк быстрее будет установить смещение заведоме больше чем максимальная длина строки
и читать построчно
fgets
 
 Top
armancho7777777 Супермодератор
Отправлено: 20 Октября, 2013 - 20:05:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Примерно - не дело.
 
 Top
LIME
Отправлено: 20 Октября, 2013 - 20:13:23
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




armancho7777777 почему?
если строка от 20 до 30 символов то проще установить смещение на -30 и считать 2 строки если первая же не достигла конца файла
(Добавление)
soleg пишет:
39-45
как раз этот случай
 
 Top
armancho7777777 Супермодератор
Отправлено: 20 Октября, 2013 - 20:35:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




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.  

(Отредактировано автором: 22 Октября, 2013 - 03:20:13)

 
 Top
tuareg
Отправлено: 20 Октября, 2013 - 20:56:23
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




armancho7777777 А PHP_EOL нельзя использовать вместо
PHP:
скопировать код в буфер обмена
  1.  
  2. ($char == "\r\n" || $char == "\n")
  3.  

?
 
 Top
teddy
Отправлено: 20 Октября, 2013 - 21:03:50
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Могу предложить
PHP:
скопировать код в буфер обмена
  1. $file = explode(PHP_EOL, file_get_contents("text.txt"));
  2. echo $file[count($file) -1];
 
 Top
armancho7777777 Супермодератор
Отправлено: 20 Октября, 2013 - 21:06:19
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




tuareg пишет:
А PHP_EOL нельзя использовать вместо

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

teddy
soleg пишет:
есть файлик весит, который около 6ГБ

(Отредактировано автором: 20 Октября, 2013 - 21:36:34)

 
 Top
SAD
Отправлено: 20 Октября, 2013 - 21:20:56
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2508
Дата рег-ции: Май 2009  
Откуда: Днепропетровск, Украина


Помог: 75 раз(а)




а не проще ее хранить в отдельном файле? и перезаписывать
 
 Top
Страниц (3): [1] 2 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB