Добро пожаловать к нам в гости! Наш сайт посвящён программе NeoBook, с помощью которой вы легко сможете создавать собственные мультимедиа-приложения без необходимости изучать сложные языки программирования! Зарегистрируйтесь, чтобы стать членом нашего сообщества.
Приветствую уважаемые =) Надеюсь есть живые. Честно я вам очень рад. Скриптовой язык в NeoBook мне достаточно понятен и я редко задаю вопросы. Однако столкнулся с одной бедой. Пишу программу которая парсит логи от другой программы. Уперся в проблему ине знаю как считать файл если он открыт другой программой. Суть в том что надо узнать количество строк в файле, если он открыт этого никак не узнать. Если в переменную считать все содержимое файла, то там образуются строки и как проводить навигацию по ним вообще не пойму. --- Сейчас сделал на "костылях" где файл лога копируется каждую секунду и считается количество строк и извлекается нужная информация. Но если утилитка запущена на флешке - нецелесообразно каждый раз так писать. Как поступить подскажите))) Интересует считывание именно последних строк. I will alive before dead
Трудновато найти живых при фактически мертвой программе, увы...
Может еще она обретет "второе дыхание", првративщись в зомби, но даже на это надежды все меньше и меньше.
ЦитатаUserDead ()
сделал на "костылях"
"На костылях" это только то, что файл надо отслеживать каждую секунду, а остальное вовсе не "на костылях", т.к. в NB по-другому и не сделать (без плагина). Все просто: читаем файл в переменную, затем парсим ее на отдельные строки, подсчитываем количество строк (размер массива), сравниваем его с предыдущим "замером", и если требуется читаем новые строки (по идее они должны быть последними) Не вижу проблем. Только вот это:
ЦитатаUserDead ()
Но если утилитка запущена на флешке - нецелесообразно каждый раз так писать.
не совсем понятно - что именно нецелесообразно?
В принципе можно даже еще упростить решение, т.е. сначала подсчитывать количество строк (FileLen), и если изменилось, то парсить и проч. А можно и еще проще (без парсинга) - посредством FileRead читать только добавленные строки.
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Благодарю за отклик) Вот именно FileLen Не работает когда открыта программа использующая файл. Не секрет это PuTTY и он сливает содержимое ssh в логи а моя утилита должна "кушать" данные. Но когда файл открыт PuTTY то нб кричит об ошибке доступа к файлу. Поэтому не могу применять FileLen. Приходится каждую секунду копировать FileCopy "[cd]log.log" "[cd]log_.log" И читать из log_.log данные. Но на флешке постоянно перезатирая копированием. Вот что не целесообразно.
ЦитатаPeter ()
Все просто: читаем файл в переменную, затем парсим ее на отдельные строки, подсчитываем количество строк (размер массива), сравниваем его с предыдущим "замером", и если требуется читаем новые строки (по идее они должны быть последними) Не вижу проблем.
Вот я выбрал FileRead "[cd]log.log" "all" "[data]" Как мне теперь переместиться на ***строку в переменной [data] Или предлагаете читать построчно не зная сколько строк в файле так как узнать это нельзя из-за того что файл открыт.
ЦитатаPeter ()
А можно и еще проще (без парсинга) - посредством FileRead читать только добавленные строки.
А если мне нужно сместиться на -2 строки. Мне все равно нужно знать на какой я строке сейчас. Такие дела I will alive before dead
Сообщение отредактировано UserDead - Вт, 20 Декабря 2016, 19:09
Но когда файл открыт PuTTY то нб кричит об ошибке доступа к файлу.
А при получении размера файла тоже "кричит"? Может быть сначала получать размер файла и если изменился то проводить все дальнейшие манипуляции?
ЦитатаUserDead ()
А если мне нужно сместиться на -2 строки. Мне все равно нужно знать на какой я строке сейчас.
Неоднократно уже говорил о том что в НБ мало возможностей для работы со строками. Самое лучшее решение на сегодняшний день это плагин hpwControl. Не хочешь читать хелп?
Вот я выбрал FileRead "[cd]log.log" "all" "[data]" Как мне теперь переместиться на ***строку в переменной [data]
ЦитатаPeter ()
читаем файл в переменную, затем парсим ее на отдельные строки, подсчитываем количество строк (размер массива), сравниваем его с предыдущим "замером", и если требуется читаем новые строки (по идее они должны быть последними)
Читать можно прямо из массива.
Цитатаmishem ()
Неоднократно уже говорил о том что в НБ мало возможностей для работы со строками
Вполне достаточно для большинства задач, нужно только не лениться.
Добавлено (20 Декабря 2016, 19:41) --------------------------------------------- Кстати, mishem, ради интереса, открой справку Delphi и посмотри там сколько в нем имеется функций для работы со строками (именно с классом string).
Заранее скажу - ты будешь удивлен! Если мне не изменяет память, то там нет даже готового аналога необушной StrParse
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
С первого раза не дошло) Уж простите. Я так понял парсить на CR-LF чтобы разобрать на строки. Потому что конец строки может быть разный, а символы переноса есть перед каждой новой строкой. Попробую оба варианта с плагином и без. --- Мысль была читать файл счетчиком пока не начнем плавать по несуществующим строкам, и откатываться построчно назад пока не появятся какие-то данные. Немного бредово звучит. I will alive before dead
Я так понял парсить на CR-LF чтобы разобрать на строки.
Если строки разделены именно этими символами, то да, но обычно в NB, когда читается текстовой файл в переменную строки разделены стандартными символами [#13][#10].
ЦитатаUserDead ()
Мысль была читать файл счетчиком пока не начнем плавать по несуществующим строкам, и откатываться построчно назад пока не появятся какие-то данные. Немного бредово звучит.
Вообще, конкретное решение во многом зависит от конкретной задачи. Оно, конечно, можно и плагином, но... Даже из имеющихся средств работы со строками в NB можно написать собственную StrParse (аналог штатной).
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Ага! Только половина из них, по сути, повторяет другую половину с небольшими вариациями, а в реальности же для практической работы нужно от силы десяток, и то не всегда. Никаких чудес там нет. К тому же, mishem, я абсолютно убежден (зная тебя) в том, что, работай ты в Delphi, рано или поздно, тебе бы и этого "достаточно" стало бы недостаточно.
И фокус тут заключается в том, что в Delphi, если чего-то нет, можно самому нашлепать каких угодно готовых функций (и не только строковых), что собственно все программеры и делают, все это совсем несложно. Мне вот например тоже пришлось варганить аналог необушной StrParse (только более продвинутый) для своих нужд (в плагинах), потому и знаю, что ее в готовом виде нет.
И в NB это тоже можно проделать (на языке самой NeoBook) , вот только скорость работы будет, мягко говоря, не высока (в сравнение с готовыми необушными функциями или Delphi)
Цитатаmishem ()
Хотя WrapText это не то?
Нет, это не оно.
Цитатаmishem ()
Я не спорю, для большинства задач вполне достаточно.
Я сейчас уже плохо помню (время много прошло), но в том же ММВ (или AMS) в сравнении с NB вообще можно сказать все очень грустно в плане работы со строками. По крайней мере было грустно, но AMS пока жива и развивается(?), так-что ситуация может и изменилась, не знаю...
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Я сейчас уже плохо помню (время много прошло), но в том же ММВ (или AMS) в сравнении с NB вообще можно сказать все очень грустно в плане работы со строками.
В mmb примерно такой же набор строковых функций и кое что сделано по удобнее немного. а вообще сколько их бы было всегда мало
В mmb примерно такой же набор строковых функций и кое что сделано по удобнее немного.
А по-подробнее можно? Сейчас специально поковырял ММВ-шные строковые функции... Гм....
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
А по-подробнее можно? Сейчас специально поковырял ММВ-шные строковые функции... Гм....
Цитата
StrFromFile(ИмяФайла$,НомерСтроки,ЧислоСтрок)
Цитата
Загружает содержимое указанного файла (или строку из файла) в строковую переменную. НомерСтроки показывает, с какой строки начнет загружаться файл, ЧислоСтрок определяет количество загружаемых строк. Если ЧислоСтрок равен -1, то загружается весь файл. Если при этом НомерСтроки>0, то загрузка файла начинается со строки, номер которой равен значению этого параметра.
в nb для извлечения нескольких строк уже приходится создавать цикл
в nb для извлечения нескольких строк уже приходится создавать цикл
Если честно, то необходимость чтения строк из файла "от и до" лично у меня ни разу не возникала. Да в NB нет аналога, но нет проблем сделать то же самое с помощью необушного скрипта. Только куда удобнее считать файл целиком в переменную, разбить на строки, а потом прочесть из массива нужные. По сути всего-то пара-тройка "лишних" строк кода. Неудобно? Не думаю... Кстати, в Delphi тоже нет такой функции (от и до) в готовом виде, и все надо делать ручками.
А вот то, что в NB не требуется "преобразование типов", в отличие от ММВ, при работе со строками реальное удобство. Впрочем, при желании всегда можно будет найти что-нибудь такое, к чему можно прицепиться и объявить удобным / неудобным. Так уж устроены эти "конструкторы" Например, в NB поиск в строке можно сделать опционально чувствительным к регистру или нет, а в ММВ?....
.
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Если честно, то необходимость чтения строк из файла "от и до" лично у меня ни разу не возникала.
чтение "от и до" и мне тоже попадалась только пару раз, а вот "от и до конца файла" очень часто
ЦитатаPeter ()
Только куда удобнее считать файл целиком в переменную, разбить на строки, а потом прочесть из массива нужные. По сути всего-то пара-тройка "лишних" строк кода. Неудобно? Не думаю...
тут все зависит от конкретных условий и задач если считывание разовое или не частое то можно и циклом если на пример как у автора темы считывание стоит в таймере с интервалом в 1 сек тут лучше одной командой
ЦитатаPeter ()
Кстати, в Delphi тоже нет такой функции (от и до) в готовом виде, и все надо делать ручками.
в Delphi скорость выполнения таких задач будет в десятки а может и в сотни раз выше
ЦитатаPeter ()
А вот то, что в NB не требуется "преобразование типов", в отличие от ММВ, при работе со строками реальное удобство.
Согласен, очень удобно, хотя и в преобразовании можно было найти свои плюсы например при преобразовании строки в число отбрасываются спец символы и буквы.
ЦитатаPeter ()
Так уж устроены эти "конструкторы" Например, в NB поиск в строке можно сделать опционально чувствительным к регистру или нет, а в ММВ?....
мы всегда будем искать плюсы и минусы сравнивая программы но все таки плюсов хочется побольше
Врт целый ресурс по ММВ, там все очень толково расписано. Когда-то и этот NB-форум ютился на том ММВ-ресурсе, за что еще раз СПАСИБО его создателям - Андрею и Юре! Но, к великому сожалению ММВ давно мертв - программа "закрыта". По каким-то причинам, разрабы ММВ свернули этот свой лучший(!) проект, и занялись разной "видео-фигней", аналогов которой в сети пруд-пруди.
Возможно программа просто стала коммерчески невыгодной....
Впрочем, еще немного такого "развития" (как в последние три года), и NB постигнет та же участь. Прискорбно, но все идет к этому, увы...
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Дописал решил) Благодарю за подсказку. Использовал метод чтения файла целиком и парсить по меткам конца строки как написал Рeter Получилось зная количество обнаруженных элементов можно иметь актуальные данные и никаких перезаписей файлов
То есть читаем весь файл + ищем строки переноса + ищем данные в последней строке, делаем что надо. Если надо пораньше смотреть строки просто минусуем от [f_dataelemets] и обновляемся 0.6 сек