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