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]
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
man пишет:
-l, --lines напечатать количество новых строк
это для чего?
тут скорее поможет
man пишет:
-L, --max-line-length напечатать длину наибольшей строки
но не думаю что это целесообразно для 6Г
всеравно весь пробежит для посчета
avtor.fox
Отправлено: 21 Октября, 2013 - 10:23:43
Постоянный участник
Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012 Откуда: Воронеж
Помог: 50 раз(а)
LIME, я нуб в никсах. Но данный код скажет количество строк в файле, а далее уже читаем сказанную строку пыхом.
LIME
Отправлено: 21 Октября, 2013 - 10:30:24
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
1 чтоб указать кол-во строк надо 1 раз файл прочитать целиком(не сохраняя в памяти но всеже)
и не важно что это сделает ОС
для пыха это сделает она же
2 чтоб прочитать указанную строку нам придется снова прочитать файл целиком чтоб отсчитать строки
тут дело даже не в никсах
EuGen
Отправлено: 21 Октября, 2013 - 12:36:24
Профессионал
Покинул форум
Сообщений всего: 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 пишет:
а не проще ее хранить в отдельном файле? и перезаписывать
- а точнее, для начала ответить на вопрос - зачем это нужно? Подозреваю, что это попытка решить не ту проблему не тем способом.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
SAD
Отправлено: 21 Октября, 2013 - 12:50:19
Постоянный участник
Покинул форум
Сообщений всего: 2508
Дата рег-ции: Май 2009 Откуда: Днепропетровск, Украина
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
считываем по байту от конца файла до нахождения символа \n
потом на всяк случай тримим символ \r
Задача решена. А споров на две страницы.
----- Чем больше узнаю, тем больше я не знаю.
armancho7777777
Отправлено: 21 Октября, 2013 - 17:19:11
Активный участник
Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011 Откуда: Москва
Помог: 221 раз(а)
EuGen пишет:
- а точнее, для начала ответить на вопрос - зачем это нужно? Подозреваю, что это попытка решить не ту проблему не тем способом.
Лично мне надо получить последнюю строку файла весом 6гб.
Как Вы бы это сделали средствами PHP ? (Добавление) EuGen, а то Вы последнее время то и дело пишите что и как не верно, а как верно сказать не можете.
"Килограммы" никчёмного текста.
Видимо у Лайма берёте пример...
EuGen
Отправлено: 21 Октября, 2013 - 17:32:03
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
armancho7777777
Не уверен, как прокомментировать последнее сообщение. Поскольку обычно я придерживаюсь конструктивизма, то неплохо было бы узнать, в чём состоят (и в каком объеме) вышеупомянутые единицы массы моих ненужных комментариев. На всякий случая, я, конечно, вспомнил мои последние "объемные" комментарии - наподобие этого, этого или этого. Больше в обозримом прошлом мною не было ничего создано. Поскольку скрывать мне особенно нечего, то всегда можно обратиться к данному списку. Дабы не возникало эффекта "оправдания" - всё это приведено лишь по той причине - что Вы - достаточно давно на конференции и степень доверия к Вам много выше, чем к иным её посетителям.
По данной теме - я решил уточнить исходную проблему, отметив при этом, как раз-таки верную на мой взгляд мысль пользователя SAD о том, что, скорее всего, исходный вопрос возник из-за неверного её понимания (и я всего лишь несколько поправил высказывание данного пользователя). Можно считать это ответом на вопрос "как бы сделал я" - то есть "я бы сначала выяснил".
Хотелось бы избежать обсуждения конкретных пользователей в данной теме, поскольку это будет вне топика. Все предложения/жалобы/нарекания я охотно выслушаю через сервис личных сообщений.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
armancho7777777
Отправлено: 21 Октября, 2013 - 17:47:15
Активный участник
Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011 Откуда: Москва
Помог: 221 раз(а)
armancho7777777 пишет:
лично мне надо получить последнюю строку файла весом 6гб.
Как Вы бы это сделали средствами PHP ?
(Добавление)
EuGen пишет:
Такой же код посчитает возврат каретки переводом строки в *nix, например, что неверно.
Значит надо так же проверять платформу.
Не вижу ни каких проблем. (Добавление)
Мне тут подсказали что и в мас'ах в основном "\n",
так что достаточно будет проверить что поседний символ == \n
Squirrel
Отправлено: 22 Октября, 2013 - 04:42:45
Забанен
Покинул форум
Сообщений всего: 147
Дата рег-ции: Авг. 2013
Помог: 4 раз(а)
[+]
armancho7777777 пишет:
Лично мне надо получить последнюю строку файла весом 6гб.
Как Вы бы это сделали средствами PHP ?
Лично я бы сначала уточнила ТЗ.
Файл же не из воздуха берется. Что-то его создает. А пока это похоже на обсуждение сферического коня.
Первый момент. Конец строк в файле будет всегда одинаковый, и выяснить какой именно, даже если аффтор файлогенератора недоступен легко можно.
Второй момент. Возможно выяснить, какая максимальная длина строки в этом файле. Если она относительно небольшая, то решение вообще примитивное.
1) Считываешь последние байты в файле в строковую переменную.
2) Из конца удаляешь все символы с кодом меньше 0x32
3) Если вероятность, что делали на видне или юниксе ищешь последнее вхождение "\n" в свою строку. Отсекаешь все, до этого вхождения.
4) Если вероятность, что делали на маке ищешь последнее вхождение "\r" в свою строку. Отсекаешь все, до этого вхождения.
Вот и все, в строковой переменной остается только последняя строка.
tuareg
Отправлено: 30 Октября, 2013 - 15:09:05
Участник
Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010
Помог: 69 раз(а)
А давайте, под итожим? Как лучше всего получить последнюю строку в файле 6гб
Решение простое есть?
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.