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 :: Получить последнюю строку файла [2]

 PHP.SU

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


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

> Без описания
avtor.fox
Отправлено: 20 Октября, 2013 - 22:15:17
Post Id



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


Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012  
Откуда: Воронеж


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




PHP:
скопировать код в буфер обмена
  1. $sFile= 'test.txt';
  2. function CountLines($sFile) {
  3.     return trim(exec("wc -l ".$sFile));
  4. }
  5. echo CountLines($sFile);


а там разбирайтесь Улыбка

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

 
 Top
LIME
Отправлено: 21 Октября, 2013 - 09:12:11
Post Id


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


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


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




man пишет:
-l, --lines напечатать количество новых строк

это для чего?
тут скорее поможет
man пишет:
-L, --max-line-length напечатать длину наибольшей строки

но не думаю что это целесообразно для 6Г
всеравно весь пробежит для посчета
 
 Top
avtor.fox
Отправлено: 21 Октября, 2013 - 10:23:43
Post Id



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


Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012  
Откуда: Воронеж


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




LIME, я нуб в никсах. Но данный код скажет количество строк в файле, а далее уже читаем сказанную строку пыхом.
 
 Top
LIME
Отправлено: 21 Октября, 2013 - 10:30:24
Post Id


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


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


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




1 чтоб указать кол-во строк надо 1 раз файл прочитать целиком(не сохраняя в памяти но всеже)
и не важно что это сделает ОС
для пыха это сделает она же
2 чтоб прочитать указанную строку нам придется снова прочитать файл целиком чтоб отсчитать строки
тут дело даже не в никсах
 
 Top
EuGen Администратор
Отправлено: 21 Октября, 2013 - 12:36:24
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




avtor.fox
Если уже делать через внешний вызов, то почему не tail -n 1 ?

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

Нет, поскольку считывание идёт в один байт. Если PHP_EOL будет использоваться под Win, то равенства, очевидно, не произойдёт никогда, ведь один байт никогда не будет равен двум сразу.

armancho7777777 пишет:
if($strlen && ($char == "\r" || $char == "\n"))

Так проверять перенос строки - некорректно, поскольку в зависимости от OS перенос строки может быть разным. Такой же код посчитает возврат каретки переводом строки в *nix, например, что неверно.

Правильная мысль:
SAD пишет:
а не проще ее хранить в отдельном файле? и перезаписывать

- а точнее, для начала ответить на вопрос - зачем это нужно? Подозреваю, что это попытка решить не ту проблему не тем способом.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
SAD
Отправлено: 21 Октября, 2013 - 12:50:19
Post Id



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


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


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




[пардоньте]
(Добавление)
пропал ТС, а мы спорим

(Отредактировано автором: 21 Октября, 2013 - 12:55:03)

 
 Top
DelphinPRO
Отправлено: 21 Октября, 2013 - 13:19:35
Post Id



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


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


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




считываем по байту от конца файла до нахождения символа \n
потом на всяк случай тримим символ \r
Задача решена. А споров на две страницы. Улыбка


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
armancho7777777 Супермодератор
Отправлено: 21 Октября, 2013 - 17:19:11
Post Id



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


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


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




EuGen пишет:
- а точнее, для начала ответить на вопрос - зачем это нужно? Подозреваю, что это попытка решить не ту проблему не тем способом.

Лично мне надо получить последнюю строку файла весом 6гб.
Как Вы бы это сделали средствами PHP ?
(Добавление)
EuGen, а то Вы последнее время то и дело пишите что и как не верно, а как верно сказать не можете.
"Килограммы" никчёмного текста.
Видимо у Лайма берёте пример...
 
 Top
EuGen Администратор
Отправлено: 21 Октября, 2013 - 17:32:03
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




armancho7777777
Не уверен, как прокомментировать последнее сообщение. Поскольку обычно я придерживаюсь конструктивизма, то неплохо было бы узнать, в чём состоят (и в каком объеме) вышеупомянутые единицы массы моих ненужных комментариев. На всякий случая, я, конечно, вспомнил мои последние "объемные" комментарии - наподобие этого, этого или этого. Больше в обозримом прошлом мною не было ничего создано. Поскольку скрывать мне особенно нечего, то всегда можно обратиться к данному списку. Дабы не возникало эффекта "оправдания" - всё это приведено лишь по той причине - что Вы - достаточно давно на конференции и степень доверия к Вам много выше, чем к иным её посетителям.

По данной теме - я решил уточнить исходную проблему, отметив при этом, как раз-таки верную на мой взгляд мысль пользователя SAD о том, что, скорее всего, исходный вопрос возник из-за неверного её понимания (и я всего лишь несколько поправил высказывание данного пользователя). Можно считать это ответом на вопрос "как бы сделал я" - то есть "я бы сначала выяснил".

Хотелось бы избежать обсуждения конкретных пользователей в данной теме, поскольку это будет вне топика. Все предложения/жалобы/нарекания я охотно выслушаю через сервис личных сообщений.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
armancho7777777 Супермодератор
Отправлено: 21 Октября, 2013 - 17:47:15
Post Id



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


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


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




armancho7777777 пишет:
лично мне надо получить последнюю строку файла весом 6гб.
Как Вы бы это сделали средствами PHP ?

(Добавление)
EuGen пишет:
Такой же код посчитает возврат каретки переводом строки в *nix, например, что неверно.

Значит надо так же проверять платформу.
Не вижу ни каких проблем.
(Добавление)
Мне тут подсказали что и в мас'ах в основном "\n",
так что достаточно будет проверить что поседний символ == \n
 
 Top
Squirrel
Отправлено: 22 Октября, 2013 - 04:42:45
Post Id


Забанен


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


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

[+]


armancho7777777 пишет:
Лично мне надо получить последнюю строку файла весом 6гб.
Как Вы бы это сделали средствами PHP ?

Лично я бы сначала уточнила ТЗ.
Файл же не из воздуха берется. Что-то его создает. А пока это похоже на обсуждение сферического коня.
Первый момент. Конец строк в файле будет всегда одинаковый, и выяснить какой именно, даже если аффтор файлогенератора недоступен легко можно.
Второй момент. Возможно выяснить, какая максимальная длина строки в этом файле. Если она относительно небольшая, то решение вообще примитивное.
1) Считываешь последние байты в файле в строковую переменную.
2) Из конца удаляешь все символы с кодом меньше 0x32
3) Если вероятность, что делали на видне или юниксе ищешь последнее вхождение "\n" в свою строку. Отсекаешь все, до этого вхождения.
4) Если вероятность, что делали на маке ищешь последнее вхождение "\r" в свою строку. Отсекаешь все, до этого вхождения.
Вот и все, в строковой переменной остается только последняя строка.
 
 Top
tuareg
Отправлено: 30 Октября, 2013 - 15:09:05
Post Id


Участник


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


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




А давайте, под итожим? Как лучше всего получить последнюю строку в файле 6гб
Решение простое есть?

(Отредактировано автором: 30 Октября, 2013 - 15:09:55)

 
 Top
caballero
Отправлено: 30 Октября, 2013 - 15:59:01
Post Id


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


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


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




читаешь от конца файла с помощью fseek например
и ищещь последнее вхождение \n или \r


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
armancho7777777 Супермодератор
Отправлено: 30 Октября, 2013 - 17:27:13
Post Id



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


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


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




tuareg пишет:
Решение простое есть?

Реализацию я выше скинул.
 
 Top
Stierus Супермодератор
Отправлено: 05 Ноября, 2013 - 16:24:59
Post Id



Рекордсмен по количеству сообщений за 7 дней


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


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




tail -n 1 path_to_file

ну и коммент 5 летней давности, если нет возможности использовать штатные никсовые команды http://www.php.net/manual/en/fun....fseek.php#86517
 
My status
 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