Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос к гуру, автоудаление нужных строк из текстового 
:(
    Опции темы
ohoho
Дата 22.6.2003, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 22.6.2003

Репутация: нет
Всего: нет



Подскажите идею реализации!
есть некий текстовой файл - приведу фрагмент:
.....
*** Код организации 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 для отслеживания факта появления архива в заданной директории, распаковки его и редактирования с целью автоматического удаления строк, начинающихся с определенного номера и - очень желательно - одной строчки выше удаляемого блока (нач. с Телефон Дата) и одной строчки ниже ( Кол-во разговоров). Потом все должно запаковаться обратно в архив с замещением старого файла. Все это полностью без моего участия. Как и чем лучше организовать такое редактирование текстового файла, чтобы без всякой интерактивности, в фоновом режиме? Спасибо за внимание.

PM MAIL   Вверх
-Mikle-
Дата 22.6.2003, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 8
Всего: 59



С распаковкой и запаковкой не работал, не знаю. Должно быть не сложно...
Могу написать для тебя функцию удаления всего блока с телефоном, который ты ей передашь, это не сложно... Какой разделитель между колонками? (пробел, табуляция...) И, если не секрет, зачем тебе это?


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
ohoho
Дата 22.6.2003, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 22.6.2003

Репутация: нет
Всего: нет



За функцию буду искренне признателен! Разделитель между колонками - пробел. Прошу обратить внимание, что не весь текст в файле форматирован по колонкам. Зачем мне это - вовсе не секрет. Это лог междугородних переговоров с нашего предприятия. Я иногда делаю звонки строго по работе. Наш дотошный экономист заставляет делать подробный отчет по каждому звонку, а я не всегда все помню. Вопрос об оплате тут не стоит, так как мы являемся предприятием связи и не платим сами себе за свои услуги, но отчитываться, как пацану, куда это я звонил - надоело уже. Так что это вопрос не корысти, а чисто политический!
PM MAIL   Вверх
-Mikle-
Дата 22.6.2003, 21:03 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 8
Всего: 59



С разделителем поторопился, не понадобился. smile.gif
Если я тебя правильно понял, то в одном блоке находятся строки с одним номером, в другом блоке с другим номером. Если так, то вот образец функции, которая ищет блок, и проверяет на то, ЧТО ПЕРВАЯ СТРОКА в блоке начинается с указанного номера телефона, и в положительном случае переписывает в этот же файл без найденого блока. Если первая строка не такая, то ищется следущий блок. Она ищет и удаляет только один блок. Функция возвращает "True", если удаление блока произошло.

Код
Function DeleteBlock(strFileName As String, strTel As String) As Boolean
  Dim lFn As Long
  Dim lP As Long
  Dim lStartBlok As Long
  Dim sBuf As String
 
  DeleteBlock = False
 
  'Читаем файл
  lFn = FreeFile
  Open strFileName For Binary Access Read As #lFn
     sBuf = String$(LOF(lFn), vbNullChar)
     Get #lFn, , sBuf
  Close #lFn
  If Trim$(sBuf) = "" Then Exit Function 'Выход, если файл пустой
 
  lStartBlok = 1
  lP = 1
 
  Do
     'Находим слово 'Телефон' (начало удаляемого блока)
     While Mid$(sBuf, lP, 7) <> "Телефон"
        lP = InStr(lP, sBuf, vbCrLf) + 2
        If lP = 2 Then Exit Do
     Wend
     lStartBlok = lP
     
     lP = InStr(lP, sBuf, vbCrLf) + 2 'переходим к следуещей строке
     'если она начинается с нужного телефона, то мы нашли блок
     If Mid$(sBuf, lP, Len(strTel)) = strTel Then
        'ищем начало строку со словами 'Кол-во разговоров' (последняя строка блока)
        lP = InStr(lP, sBuf, "Кол-во разговоров")
        'переходим к следуещей строке
        lP = InStr(lP, sBuf, vbCrLf) + 2
        'Пишем в файл
        lFn = FreeFile
        Open strFileName For Output As #lFn
           Print #lFn, Left$(sBuf, lStartBlok - 1); 'Часть до слова 'Телефон'
           Print #lFn, Mid$(sBuf, lP + 2); 'Оставшуюся часть после (блока+одна_строка)
        Close #lFn
        DeleteBlock = True
        Exit Do
     End If
  Loop
End Function
adv/76.gif


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
ohoho
Дата 23.6.2003, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 22.6.2003

Репутация: нет
Всего: нет



Спасибо!
Что-то пока не получается применить его к конкретному файлу - я в Access пробовал, функцию поставил в модуль, а его привязал к кнопке - при запуске пишет, что "Объект не содержит программируемый объект "StrFileName"". Наверное, я туплю в плане найти в коде место, где нужно прописать имя файла. Сейчас попробую в "чистом" VB.
PM MAIL   Вверх
-Mikle-
Дата 24.6.2003, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 8
Всего: 59



Получилось?


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
ohoho
Дата 24.6.2003, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 22.6.2003

Репутация: нет
Всего: нет



Получилось, классно!
Показал одному парню твой код - он сказал, что сделано очень красиво. Жаль только, что текстовой файл на 3 мегабайта обрабатывался на PIII около 2х часов. Но главное - работает! Большое спасибо. (Всегда завидовал белой завистью толковым программерам - я то сам всего лишь сетевой администратор...) Попробуем как-нибудь ускорить выполнение, а то не очень фоново получается.
PM MAIL   Вверх
-Mikle-
Дата 24.6.2003, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 8
Всего: 59



Не стоит благодарности. Это ведь форум, сюда приходят за помощью smile.gif
Если будут проблемы с оптимизацией пиши на мыло [email protected] Счастливо.
adv/76.gif


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
cardinal
Дата 24.6.2003, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99



ohoho тут есть одна приколка. Называется DoEvents. Она позволяет смотреть за другими процессами во время нахождения в цикле. Это только предположение, но возможно если ты добавишь эту строчку прямо перед Loop, то эти два часа превратятся во что-нибудь более приемлимое. Помоему когда я раньше с циклами экспериментировал, то они подвешивали компер при больших количествах прокруток, типа ушел в бесконечный цикл. А тут тем самым что ты написал DoEvents ты как бы говоришь, что возможно ты скажешь, что цикл надо остановить или что-нибудь такое и цикл как бы крутится не задумывясь о том "нужен я или нет" smile.gif, но при этом крутится и смотрит. Повторяю, что это только мои догадки, но если это убыстрит твой процесс, то какая-то доля правды в этих догадках есть.


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
-Mikle-
Дата 25.6.2003, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 8
Всего: 59



cardinal, осмелюсь немного поправить. Комнда DoEvents дает задание, обработать все события твоей прграммы. То есть дав такую команду, виндоз один раз обработает все клики, паинты, ресайзы, которые пришли на форму, но небыли обработаны из-за занятости программы. Так что эта команда скорее тормозит, чем ускоряет. Ее можно использовать тогда, когда во время обработки большого объема данных, требуется контролировать пользователя. Например то, что он нажал кнопку Отмена. Без этой команды в цикле обработки, событие клик кнопки, обработается только по завершении цикла. В случае ohoho, не требуется обрабатывать внешних вмешательств, поэтому эта команда будет только тормозить.
Долго он может работать из-за того, что он сначала сразу читает весь файл в переменную. Я так сделал, потому-что не думал что лог может быть 3 Мб.
Оптимизировать можно по другому. Если обрабатывать строки сразу, во время чтения, т.е. читать строку и сразу проверять, если она нам не нужна, то записывать ее в другой файл, а если нужна(содержит искомый телефон), то читать не записывая до тех пор, пока не кончится блок. Потом дописать кусок оставшегося файла. Но этот алгоритм надо еще проверить, может быть он даже медленее. smile.gif Короче, как всегда, нужен эксперимент.
adv/76.gif


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
-Mikle-
Дата 25.6.2003, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 8
Всего: 59



Скорее всего медленнее... satisfied.gif


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
cardinal
Дата 25.6.2003, 03:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99



Цитата
Так что эта команда скорее тормозит, чем ускоряет.

да, согласен

Провел парочку экспериментов. Да в принципе быстрее с DoEvents не становится, но с другой стороны польза то с ним есть. У меня например, при паралельном долбании компера, на цикл в 200000 оборотов уходило секунд так на 10 больше (чем без DoEvents), но я мог паралельно в шахматы играть smile.gif , а без все конечно побыстрее, но ни хрена ты паралельно сделать не можешь, а тут уж надо быть сильно терпеливым, чтобы не проверить 2 часа свой почтовый ящик biggrin.gif .
Ну ладно - это фигня. Настоящая проблема в том, как сделать алгоритм получше.
ohoho, а у тебе примерно изсвестно в каком месте файла сидит твой блок. Тут не надо говорить 100% в последних 100 строках (что конечно лучше), а тут например уже тот факт, что ты знаешь, что в вероятность того, что блок в последней четверти файла может офигенно помочь. Пиши будем выдумывать алгоритм smile.gif .


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Unregistered
Дата 25.6.2003, 15:22 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Я вот просил то же самое на другом форуме, так сначала мне модератор сказал, что тут не надо быть гуру, я спросил, а нельзя ли поконкретнее? Тогда он заподозрил меня в попытке халявной экслуатации чужих мозгов, потом сказал, что на мой вопрос нельзя ответить, так, как я сам не знаю, что хочу и сказал, что переведет мой вопрос в раздел "Работа". Стало как то грустно и я вопрос там вообще снял. Когда я раньше помогал в конфах и в эхе по настройке Novell Netware, Windows NT Sever или по TCP/IP маршрутизации, у меня вовсе не было ощущения, что меня кто-то использует... Хотя бывает, что некоторые задают такие вопросы, что видно, что человек или ленится нажать F1 или замахивается на очень глобальные вещи не имея вообще никакой теоретической базы. Одно дело, если он просто молод и жаден до великих свершений, что есть хорошо. Другое дело, если он ленив и не хочет напрягаться. Увы, я уже не попадаю под первое и надеюсь, что не произвожу впечатление второго :- ))). Короче - спасибо! Насчет примерного местонахожения блока в файле - то нет, это будет по разному.
  Вверх
Unregistered
Дата 25.6.2003, 15:53 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Если применить чисто обывательский подход. В ручном режиме я обычно в своем любимом FARe захожу в архив, делаю на файле внутри архива F4 (редактирование), F7 (поиск), ввожу номер, прыгаю на строку вверх (нач. с Телефон), Home (в начало строки), шифтом и стрелкой вниз тяну блок выделения до конца блока с номером, прихватываю строчку ниже (нач. с Кол-во разговоров), грохаю блок, выхожу с сохранением, подтверждаю изменение в архиве (Ctrl+Enter) и всё готово и очень быстро, отвлекая при этом присутствующих каким нибудь анекдотом для коспирации. Я и подумал, нельзя ли это автоматизировать и не появляться физически в том кабинете. локальной сети пока там нет, иначе мои мысли пошли бы по другому пути, но в перспективе я сеть дотяну.То есть я то сам, руками делаю это достаточно быстро! Первое,что пришло в голову - использовать nnCron - он отследит появление архива, распакует его. После редактирования он же все запакует, заместив измененный файл. Для этого я применю или скрипты nnCron или вызываемые им же нужные мне bat файлы. Может быть есть смысл притянуть сюда какой нибудь текстовой редактор, который можно запрограммировать? Я думал уже об импорте текстовухи в Excel, но он не влазит в лист из=за ограничения кол-ва строк. А может макрос в ворде спасет? Хотя это, наверное возврат к приведенной выше функции?
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0725 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.