| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > VB6 > Вопрос к гуру |
| Автор: ohoho 22.6.2003, 18:09 |
| Подскажите идею реализации! есть некий текстовой файл - приведу фрагмент: ..... *** Код организации 5085 *** Телефон Дата Гор Т Вр У Пр Сумма Выз.Тел 9723003 0529 269 3 0835 0 3 29.70 21615 9723003 0530 269 3 0536 0 3 29.70 21615 Кол-во разговоров 2 Продолжительность 6 Начислено 59.40 Телефон Дата Гор Т Вр У Пр Сумма Выз.Тел 923408 0514 236 3 0847 0 1 4.50 43003 9723408 0527 224 3 0346 0 5 49.50 60531 Кол-во разговоров 2 Продолжительность 6 Начислено 54.00 ....... вернее по почте придет архив, содержащий такой файл. Я хочу приспособить nnCron для отслеживания факта появления архива в заданной директории, распаковки его и редактирования с целью автоматического удаления строк, начинающихся с определенного номера и - очень желательно - одной строчки выше удаляемого блока (нач. с Телефон Дата) и одной строчки ниже ( Кол-во разговоров). Потом все должно запаковаться обратно в архив с замещением старого файла. Все это полностью без моего участия. Как и чем лучше организовать такое редактирование текстового файла, чтобы без всякой интерактивности, в фоновом режиме? Спасибо за внимание. |
| Автор: -Mikle- 22.6.2003, 19:22 |
| С распаковкой и запаковкой не работал, не знаю. Должно быть не сложно... Могу написать для тебя функцию удаления всего блока с телефоном, который ты ей передашь, это не сложно... Какой разделитель между колонками? (пробел, табуляция...) И, если не секрет, зачем тебе это? |
| Автор: ohoho 22.6.2003, 20:05 |
| За функцию буду искренне признателен! Разделитель между колонками - пробел. Прошу обратить внимание, что не весь текст в файле форматирован по колонкам. Зачем мне это - вовсе не секрет. Это лог междугородних переговоров с нашего предприятия. Я иногда делаю звонки строго по работе. Наш дотошный экономист заставляет делать подробный отчет по каждому звонку, а я не всегда все помню. Вопрос об оплате тут не стоит, так как мы являемся предприятием связи и не платим сами себе за свои услуги, но отчитываться, как пацану, куда это я звонил - надоело уже. Так что это вопрос не корысти, а чисто политический! |
| Автор: -Mikle- 22.6.2003, 21:03 | ||
| С разделителем поторопился, не понадобился. Если я тебя правильно понял, то в одном блоке находятся строки с одним номером, в другом блоке с другим номером. Если так, то вот образец функции, которая ищет блок, и проверяет на то, ЧТО ПЕРВАЯ СТРОКА в блоке начинается с указанного номера телефона, и в положительном случае переписывает в этот же файл без найденого блока. Если первая строка не такая, то ищется следущий блок. Она ищет и удаляет только один блок. Функция возвращает "True", если удаление блока произошло.
|
| Автор: ohoho 23.6.2003, 16:49 |
| Спасибо! Что-то пока не получается применить его к конкретному файлу - я в Access пробовал, функцию поставил в модуль, а его привязал к кнопке - при запуске пишет, что "Объект не содержит программируемый объект "StrFileName"". Наверное, я туплю в плане найти в коде место, где нужно прописать имя файла. Сейчас попробую в "чистом" VB. |
| Автор: -Mikle- 24.6.2003, 18:37 |
| Получилось? |
| Автор: ohoho 24.6.2003, 20:43 |
| Получилось, классно! Показал одному парню твой код - он сказал, что сделано очень красиво. Жаль только, что текстовой файл на 3 мегабайта обрабатывался на PIII около 2х часов. Но главное - работает! Большое спасибо. (Всегда завидовал белой завистью толковым программерам - я то сам всего лишь сетевой администратор...) Попробуем как-нибудь ускорить выполнение, а то не очень фоново получается. |
| Автор: -Mikle- 24.6.2003, 21:16 |
| Не стоит благодарности. Это ведь форум, сюда приходят за помощью Если будут проблемы с оптимизацией пиши на мыло [email protected] Счастливо. |
| Автор: cardinal 24.6.2003, 22:13 |
| ohoho тут есть одна приколка. Называется DoEvents. Она позволяет смотреть за другими процессами во время нахождения в цикле. Это только предположение, но возможно если ты добавишь эту строчку прямо перед Loop, то эти два часа превратятся во что-нибудь более приемлимое. Помоему когда я раньше с циклами экспериментировал, то они подвешивали компер при больших количествах прокруток, типа ушел в бесконечный цикл. А тут тем самым что ты написал DoEvents ты как бы говоришь, что возможно ты скажешь, что цикл надо остановить или что-нибудь такое и цикл как бы крутится не задумывясь о том "нужен я или нет" |
| Автор: -Mikle- 25.6.2003, 00:27 |
| cardinal, осмелюсь немного поправить. Комнда DoEvents дает задание, обработать все события твоей прграммы. То есть дав такую команду, виндоз один раз обработает все клики, паинты, ресайзы, которые пришли на форму, но небыли обработаны из-за занятости программы. Так что эта команда скорее тормозит, чем ускоряет. Ее можно использовать тогда, когда во время обработки большого объема данных, требуется контролировать пользователя. Например то, что он нажал кнопку Отмена. Без этой команды в цикле обработки, событие клик кнопки, обработается только по завершении цикла. В случае ohoho, не требуется обрабатывать внешних вмешательств, поэтому эта команда будет только тормозить. Долго он может работать из-за того, что он сначала сразу читает весь файл в переменную. Я так сделал, потому-что не думал что лог может быть 3 Мб. Оптимизировать можно по другому. Если обрабатывать строки сразу, во время чтения, т.е. читать строку и сразу проверять, если она нам не нужна, то записывать ее в другой файл, а если нужна(содержит искомый телефон), то читать не записывая до тех пор, пока не кончится блок. Потом дописать кусок оставшегося файла. Но этот алгоритм надо еще проверить, может быть он даже медленее. |
| Автор: -Mikle- 25.6.2003, 00:31 |
| Скорее всего медленнее... |
| Автор: cardinal 25.6.2003, 03:40 | ||
да, согласен Провел парочку экспериментов. Да в принципе быстрее с DoEvents не становится, но с другой стороны польза то с ним есть. У меня например, при паралельном долбании компера, на цикл в 200000 оборотов уходило секунд так на 10 больше (чем без DoEvents), но я мог паралельно в шахматы играть Ну ладно - это фигня. Настоящая проблема в том, как сделать алгоритм получше. ohoho, а у тебе примерно изсвестно в каком месте файла сидит твой блок. Тут не надо говорить 100% в последних 100 строках (что конечно лучше), а тут например уже тот факт, что ты знаешь, что в вероятность того, что блок в последней четверти файла может офигенно помочь. Пиши будем выдумывать алгоритм |
| Автор: Unregistered 25.6.2003, 15:22 |
| Я вот просил то же самое на другом форуме, так сначала мне модератор сказал, что тут не надо быть гуру, я спросил, а нельзя ли поконкретнее? Тогда он заподозрил меня в попытке халявной экслуатации чужих мозгов, потом сказал, что на мой вопрос нельзя ответить, так, как я сам не знаю, что хочу и сказал, что переведет мой вопрос в раздел "Работа". Стало как то грустно и я вопрос там вообще снял. Когда я раньше помогал в конфах и в эхе по настройке Novell Netware, Windows NT Sever или по TCP/IP маршрутизации, у меня вовсе не было ощущения, что меня кто-то использует... Хотя бывает, что некоторые задают такие вопросы, что видно, что человек или ленится нажать F1 или замахивается на очень глобальные вещи не имея вообще никакой теоретической базы. Одно дело, если он просто молод и жаден до великих свершений, что есть хорошо. Другое дело, если он ленив и не хочет напрягаться. Увы, я уже не попадаю под первое и надеюсь, что не произвожу впечатление второго :- ))). Короче - спасибо! Насчет примерного местонахожения блока в файле - то нет, это будет по разному. |
| Автор: Unregistered 25.6.2003, 15:53 |
| Если применить чисто обывательский подход. В ручном режиме я обычно в своем любимом FARe захожу в архив, делаю на файле внутри архива F4 (редактирование), F7 (поиск), ввожу номер, прыгаю на строку вверх (нач. с Телефон), Home (в начало строки), шифтом и стрелкой вниз тяну блок выделения до конца блока с номером, прихватываю строчку ниже (нач. с Кол-во разговоров), грохаю блок, выхожу с сохранением, подтверждаю изменение в архиве (Ctrl+Enter) и всё готово и очень быстро, отвлекая при этом присутствующих каким нибудь анекдотом для коспирации. Я и подумал, нельзя ли это автоматизировать и не появляться физически в том кабинете. локальной сети пока там нет, иначе мои мысли пошли бы по другому пути, но в перспективе я сеть дотяну.То есть я то сам, руками делаю это достаточно быстро! Первое,что пришло в голову - использовать nnCron - он отследит появление архива, распакует его. После редактирования он же все запакует, заместив измененный файл. Для этого я применю или скрипты nnCron или вызываемые им же нужные мне bat файлы. Может быть есть смысл притянуть сюда какой нибудь текстовой редактор, который можно запрограммировать? Я думал уже об импорте текстовухи в Excel, но он не влазит в лист из=за ограничения кол-ва строк. А может макрос в ворде спасет? Хотя это, наверное возврат к приведенной выше функции? |