Проблема:
Мне нужно получить данные из журналов авторизации в течение ок. 30 локаций. Журналы в формате CSV.
Чтобы анализ был полезным, записи в журнале должны соответствовать часам работы мест. Данные хранятся в каталогах, названных для периода времени, который охватывает данные: например, data / june1-june30 /. Файлы CSV просто названы с кодом местоположения
например, LOC1.csv, LOC2.csv. Вот пример типичного журнала:
2010-06-01, 08:30:00 , 0
2010-06-01, 09:30:00 , 1
2010-06-01, 10:30:00 , 10
2010-06-01, 11:30:00 , 7
2010-06-01, 12:30:00 , 8
2010-06-01, 13:30:00 , 6
2010-06-01, 14:30:00 , 3
2010-06-01, 15:30:00 , 8
2010-06-01, 16:30:00 , 11
Записи показывают количество успешных аутентифицированных сеансов за период времени, указанный в 3-м поле. Журналы представляют данные за 24 часа, которые бесполезны для анализа, поскольку часы работы отличаются от места к месту. Теперь проблема заключается в том, как получить только те данные, которые соответствуют часам работы. Анализ должен показать активность за часы работы, чтобы быть полезными.
Настройка - пока что
Я решил создать файл конфигурации, используя YAML с массивами / хэшами для каждого местоположения.
напр.,
- branch: headquarters
abbrev: HQ
months: [04, 06]
DOW: [M, T, W, Th]
hours:
M: [12, 13, 14, 15, 16, 17, 18]
T: [12, 13, 14, 15, 16, 17, 18]
W: [09, 10, 11, 12, 13, 14, 15,
16, 17, 18]
Th: [12, 13, 14, 15, 16, 17, 18,
19, 20]
Обозначение месяцев показывает самые загруженные месяцы, так как это все, что нас волнует.
Где я нахожусь
Код найдет соответствующие каталоги с помощью массива месяцев, а затем извлечет правильные файлы CSV с помощью массива abbrev. Итак, у меня есть файлы, которые мне нужны, хранящиеся в массиве @files. Мой вопрос сводится к дизайну. Результаты должны соответствовать соответствующим датам каждого месяца. Понедельник, вторник ... и т. Д. Создаю ли я месячные массивы, хранящие даты для каждого дня недели?
Я застрял и не уверен, куда идти отсюда.
уточнить: код уже тянет правильный
файлы и загружает их в массив (используя globbing и Find :: File) для каждой ветви. Теперь вопрос об итерации массива @files для каждой ветви и извлечении информации.
EDIT:
согласно запросу: я поставлю код. Это товары для хранения этих файлов
по месяцам, указанным в хеше. Это легкая часть.
foreach my $branch (@$config) {
my $name = $branch->{'branch'};
my $months = $branch->{'months'};
my $abbrev = $branch->{'abbrev'};
# find directories for busy months, load in @dirs
my @dirs;
foreach my $month (@$months) {
my $regex2 = qr(stats_2010-$month.*);
map { push(@dirs, $_) if $_ =~ $regex2 } @stats_dir;
}
# find csv files within directories, load in @files
my @files;
find(\&wanted, @dirs);
sub wanted {
push(@files, $_) if $_ =~ /$abbrev\.csv/;
}
Выход:
Вывод, который я надеюсь получить: Строки из каждого файла, представляющие часы работы для этой ветви. Я думаю, что они могут быть выведены в отдельный файл для простоты. И в том же формате. Что затрудняет то, что вы должны соответствовать понедельникам, вторникам .. и т. Д. с датами как-то. Это связано с разными часами работы в разные дни.
Я делаю проблему сложнее, чем нужно? Я сидел с этим слишком долго, и я надеюсь, что свежий взгляд поможет мне выпрямиться. Мой Perl в порядке, но мне нужна помощь в отделе дизайна / алгоритма. Думаю, я могу понять, как это сделать. Но не стесняйтесь размещать Perl. Я люблю читать хорошие Perl!
Со временем я буду усреднять активность по понедельникам, вторникам и т. Д. каждого месяца.
Спасибо ~
Bubnoff