![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
Роман |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 15 Пол: Мужской Реальное имя: Роман Репутация: ![]() ![]() ![]() |
Собственно вот задание: Написать программу по разбивке и анализу содержимого файла отчета работы ПО (log-файла).
Необходимо проанализаровать и подсчитать запросы, а также вывести их в алфавитном порядке с подсчетом колическтва повторений. Программа должна выдавать отчет о своей работе в виде: Дата Запросы 25.04.2002 - 12 26.04.2002 - 10 27.04.2002 - 5 ... Всего было сделано (запросов) - 1679 Сортировка запросов: Бухгалтерский учет - 25 Бухгалтерский журнал - 30 Экономика Томска - 6 Экономика Якутии - 1 ... Пример файла отчета работы программы wslog.txt Сортировку запросов необходимо проводить по CGI-переменным S21STR= S21ALL= Проблема в том что у меня во второй части программы (подсчет и сортировка самих текстовых запросов) переполняется массив... а вот как сделать без массива не пойму...
![]() |
![]() ![]() |
IUnknown |
![]()
Сообщение
#2
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата Проблема в том что у меня во второй части программы (подсчет и сортировка самих текстовых запросов) переполняется массив проблема возникнет раньше. К примеру, в твоем файле, который прикреплен - строка №1034 является проблемной. Ты прочтешь ее из файла, найдешь в ней подстроку 'S21STR=', а вот символа '&' уже не найдешь. Он вне досягаемости в Турбо-Паскале. Потому что находится на позиции №258 в строке, а прочтешь ты только 255 (больше в String просто не влезет). В итоге получишь банальный вылет программы.Отсюда первый вопрос: уверен, что хочешь продолжать именно с использованием Турбо-Паскаля, и изобретать костыли, вместо того, чтоб взять нормальный компилятор и начать решать задачу? В зависимости от твоего ответа будем думать дальше: либо как обойти эти ограничения, либо... Какой компилятор использовать взамен (хотя тут, конечно, решение напрашивается само собой)... Сообщение отредактировано: IUnknown - 28.05.2011 20:08 |
Роман |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Пользователи Сообщений: 15 Пол: Мужской Реальное имя: Роман Репутация: ![]() ![]() ![]() |
проблема возникнет раньше. К примеру, в твоем файле, который прикреплен - строка №1034 является проблемной. Ты прочтешь ее из файла, найдешь в ней подстроку 'S21STR=', а вот символа '&' уже не найдешь. Он вне досягаемости в Турбо-Паскале. Потому что находится на позиции №258 в строке, а прочтешь ты только 255 (больше в String просто не влезет). В итоге получишь банальный вылет программы. Отсюда первый вопрос: уверен, что хочешь продолжать именно с использованием Турбо-Паскаля, и изобретать костыли, вместо того, чтоб взять нормальный компилятор и начать решать задачу? В зависимости от твоего ответа будем думать дальше: либо как обойти эти ограничения, либо... Какой компилятор использовать взамен (хотя тут, конечно, решение напрашивается само собой)... ну можно попробовать другой компилятор. Как я понял вы имели ввиду FPC? |
IUnknown |
![]()
Сообщение
#4
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Да, я именно его имел в виду. Перекомпилируй свою программу в FPC с ключом {$H+} и увеличенным размером массивов (я сделал
const maxsize = 2000;), и чуть-чуть поправь вот этот цикл: a:=pos('S21ALL=',s2);, если в строке после S21STR не будет амперсанда - будет вылет опять же (такая строка - под номером 205 в твоем файле). Надо в Until добавить условие, чтоб проверялся конец строки: Until (a > length(s2)) or (s2[a]='&');Ну, или запоминать в целочисленной переменной длину строки (чтоб каждый раз ее не вычислять), и сравнивать со значением этой переменной... Убедись, что программа работает и выдает правильный результат. И когда результат будет правильным, таким, который тебе нужен, замени этот ужасный массив из нескольких тысяч элементов на что-нибудь типа TStringList, там тебе не придется бегать туда-сюда самописными циклами и проверять, есть ли "оно" уже в списке (для этого существуют специальные методы), и занимать это будет ровно столько места, сколько нужно, а не "с огромным запасом". Хотя, по хорошему, и искать Pos-ом строки в FPC не нужно. Есть регулярные выражения, вытягивать из строки можно что хочешь и как хочешь. |
sheka |
![]()
Сообщение
#5
|
![]() Я. ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 809 Пол: Мужской Реальное имя: Саша Репутация: ![]() ![]() ![]() |
Цитата Хотя, по хорошему, и искать Pos-ом строки в FPC не нужно. Есть регулярные выражения, вытягивать из строки можно что хочешь и как хочешь. Можно подробнее? |
IUnknown |
![]()
Сообщение
#6
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Что именно? Про регулярки? Есть модуль regexpr вот в этой папке: \FPC\2.4.2\units\{target}\regexpr, в нем присутствует все необходимое для работы с регэкспами. Можно прикрутить известный дельфийский модуль, если функционала regexpr не хватает.
Согласись, проще за один проход вытащить из строки дату/время/ключевые слова, чем бегать в поисках разных подстрок Pos-ом. А ведь при использовании Pos надо еще найти конец искомого текста, с чем как раз у автора были проблемы. Регулярное выражение от этой необходимости избавляет, сразу будет найден кусок текста, расположенный между определенными словами или символами. |
IUnknown |
![]()
Сообщение
#7
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Так... Ну, регэкспы в FPC - такие, что лучше б их вообще не было, поэтому...
...вот что получилось: (Показать/Скрыть)
Всё остальное (всего запросов, количество пустых запросов, что там еще нужно - добавь сам). Кстати, твоя программа некорректно считала количество дат. Посмотри внимательно, сколько строк в логе, и сколько тебе показывает "всего запросов" - увидишь о чем я. |
Роман |
![]()
Сообщение
#8
|
Новичок ![]() Группа: Пользователи Сообщений: 15 Пол: Мужской Реальное имя: Роман Репутация: ![]() ![]() ![]() |
Спасибо, все перекомпилировал, все работает.
Можно поподробнее как это работает?) Сообщение отредактировано: Роман - 29.05.2011 21:08 |
IUnknown |
![]()
Сообщение
#9
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата Можно поподробнее как это работает?) Что именно? Функция MySort - это самописная функция сортировки двух строк, которые находятся в StringList-е. Она должна возвращать 0, если строки равны, 1 - если первая строка больше второй, и (-1) - если наоборот, вторая строка больше первой. Потом, такая функция передается параметром в метод CustomSort, и производится сортировка строк StringList-а (все, что надо для сортировки - это знать, нужно ли менять местами 2 строки в определенный момент, так? Вот CustomSort и вызывает переданную ему функцию, чтобы понять, какая из строк больше, и в зависимости от направления сортировки, принимает - или не принимает - решение об обмене их местами). Посмотри исходники CustomSort - станет понятно, что там происходит...Первый фрагмент - это добавление в список текста запроса. То есть, start - позиция начала одного из тегов, finish - позиция амперсанда (&), процитированная тобой строка вычленит собственно сам запрос (без тега, без знака "=" и без амперсанда), и добавит его в список. А второй процитированный фрагмент - это сама "соль" программы: // для начала - печатаем все даты в файл. Причем для печати Сообщение отредактировано: IUnknown - 31.05.2011 18:38 |
Роман |
![]()
Сообщение
#10
|
Новичок ![]() Группа: Пользователи Сообщений: 15 Пол: Мужской Реальное имя: Роман Репутация: ![]() ![]() ![]() |
Спасибо теперь всё окончательно понятно
![]() ![]() |
![]() ![]() |
![]() |
Текстовая версия | 12.08.2025 9:35 |