IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Анализ log-файла..., программа обработки огромного лог файла
Роман
сообщение 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=
Проблема в том что у меня во второй части программы (подсчет и сортировка самих текстовых запросов) переполняется массив... а вот как сделать без массива не пойму...


program Laba_2;
uses crt;
var
s2:string;
f,f1:text;
g:char;
a,x,i,j,q,p:integer;
zap,m:string;
n:array [1..1000] of byte;
zn:array [1..1000]of string[40];
s,s1:string[10];
begin
clrscr;
assign(f,'wslog.txt');
assign(f1,'output.txt');
reset(f);
rewrite(f1);
x:=0;
a:=0;
q:=0;
Readln(f,s1);
Repeat
Readln(f,s);
if (s<>s1) and (s1<>'') then {если строки не одинаковы,то считает кол-во запросов в день}
begin
Writeln(f1,s1,' - ',a);
x:=x+a;
a:=0;
s1:=s;
end
else a:=a+1;{иначе суммирует кол-во одинаковых строк}
until eof(f);
Writeln(f1,' vsego zaprosov :');
Writeln(f1,x);
Reset(f);
{S21STR}
Repeat
Readln(f,s2);
a:=pos('S21STR=',s2);
if a<>0 then
begin
a:=a+7;
zap:='';
if S2[a]='' then q:=q+1 else
Repeat
zap:=zap+s2[a]; {считывает послед.символы после 'S21STR=' до &}
a:=a+1;
Until s2[a]='&';
for i:=1 to 1000 do
begin
if zap=zn[i] then begin n[i]:=n[i]+1; break; end;
if zn[i]='' then begin zn[i]:=zap; inc(n[i]); break;
{считает кол-во запросов}
end;
end;
end;
until eof(f);

{S21ALL аналогично}

Repeat
Readln(f,s2);
a:=pos('S21ALL=',s2);
if a<>0 then
begin
a:=a+7;
zap:='';
if s2[a]='' then q:=q+1 else
Repeat
zap:=zap+s2[a];
a:=a+1;
Until s2[a]='&';
for i:=1 to 1000 do
begin
if zap=zn[i] then begin n[i]:=n[i]+1; break; end;
if zn[i]='' then begin zn[i]:=zap; inc(n[i]); break; end;
end;
end;
until eof(f);
{сортирует строки}
for i:=1000 downto 1 do
for j:=1 to i-1 do
if zn[j]>zn[j+1] then
begin {}
m:=zn[j+1]; p:=n[j+1];
zn[j+1]:=zn[j]; n[j+1]:=n[j];
zn[j]:=m; n[j]:=p;
end;
{выводит рез-ты в файл}
writeln(f1,' ',' ',q);{выводит кол-во пустых запрсов}
for i:=1 to 1000 do
if zn[i]<>'' then
writeln(f1,zn[i],' ',n[i]);
close(f);
close(f1);
end.


Прикрепленный файл  wslog.txt ( 408.21 килобайт ) Кол-во скачиваний: 345
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
IUnknown
сообщение 31.05.2011 18:29
Сообщение #2


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Цитата
Можно поподробнее как это работает?)
Что именно? Функция MySort - это самописная функция сортировки двух строк, которые находятся в StringList-е. Она должна возвращать 0, если строки равны, 1 - если первая строка больше второй, и (-1) - если наоборот, вторая строка больше первой. Потом, такая функция передается параметром в метод CustomSort, и производится сортировка строк StringList-а (все, что надо для сортировки - это знать, нужно ли менять местами 2 строки в определенный момент, так? Вот CustomSort и вызывает переданную ему функцию, чтобы понять, какая из строк больше, и в зависимости от направления сортировки, принимает - или не принимает - решение об обмене их местами). Посмотри исходники CustomSort - станет понятно, что там происходит...

Первый фрагмент - это добавление в список текста запроса. То есть, start - позиция начала одного из тегов, finish - позиция амперсанда (&), процитированная тобой строка вычленит собственно сам запрос (без тега, без знака "=" и без амперсанда), и добавит его в список.

А второй процитированный фрагмент - это сама "соль" программы:
   // для начала - печатаем все даты в файл. Причем для печати
// каждой из них используется функция PrintData.
// Это - потому, что я решил запросы оборачивать кавычками,
// а с датами этого делать не нужно.
Process (lstData, fout, @PrintData);

// Так. Даты напечатаны, теперь переходим к запросам.
// Сначала отсортируем их по алфавиту:
LstQueries.CustomSort(@MySort);

// Теперь уже отсортированный список выводим в тот же файл,
// но уже используя свою функцию, чтоб запросы брались в кавычки
Process (lstQueries, fout, @PrintQuery);

// Ну, и удаляем оба списка, разумеется...
lstData.Free;
lstQueries.Free;


Сообщение отредактировано: IUnknown - 31.05.2011 18:38
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 12.08.2025 5:06
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"