Проблема с диапазоном дат - PullRequest
3 голосов
/ 01 июня 2010

У меня есть файл журнала, который содержит первые несколько символов каждой строки в качестве отметки времени.

2010-06-01 04: 56: 02,802 ОТЛАДКА {Thread-27} Текстовое сообщение

2010-06-01 04: 56: 02,802 ОТЛАДКА {Thread-27} Текстовое сообщение

2010-06-01 04: 56: 02,802 ОТЛАДКА {Thread-27} Текстовое сообщение

2010-06-01 04: 56: 02,802 ОТЛАДКА {Thread-27} Текстовое сообщение

2010-06-01 05: 22: 02,802 ОТЛАДКА {Thread-27} Текстовое сообщение

2010-06-01 05: 22: 02,802 ОТЛАДКА {Thread-27} Текстовое сообщение

2010-06-01 05: 22: 02,802 ОТЛАДКА {Thread-27} Текстовое сообщение

2010-06-01 05: 22: 02,802 ОТЛАДКА {Thread-27} Текстовое сообщение

2010-06-01 06: 43: 02,802 ИНФОРМАЦИЯ {Thread-27} Текстовое сообщение

2010-06-01 06: 43: 02,803 INFO {Thread-27} Текстовое сообщение

2010-06-01 06: 43: 02,804 INFO {Thread-27} Текстовое сообщение

2010-06-01 06: 43: 02,804 ИНФОРМАЦИЯ {Thread-27} Текстовое сообщение

2010-06-01 06: 43: 02,809 ОТЛАДКА {Thread-27} Текстовое сообщение

2010-06-01 06: 43: 02,809 ОТЛАДКА {Thread-27} Текстовое сообщение

2010-06-01 06: 43: 02,809 ОТЛАДКА {Thread-27} Текстовое сообщение

2010-06-01 07: 08: 02,809 DEBUG {Thread-27} Текстовое сообщение

2010-06-01 07: 08: 02,809 DEBUG {Thread-27} Текстовое сообщение

Моя цель найти все такие строки, которые имеют временную метку за 1 час до текущего времени.

Как этого достичь?

Ответы [ 3 ]

4 голосов
/ 01 июня 2010

Модуль DateTime хорошо подходит для решения этой проблемы:

use strict;
use warnings;
use DateTime;

my $oneHourAgo = DateTime->now()->subtract( hours => 1 );
my $threshold  = join ' ', $oneHourAgo->ymd, $oneHourAgo->hms;  # Time as string

open my $logFile, '<', 'logfile.txt';

while (my $log = <$logFile>) {

    chomp $log;
    my ($time) = split /,/, $log;       # Gets current log's time

    print $log if $time ge $threshold;  # String-compares log's time to threshold
}

close $logFile;
1 голос
/ 01 июня 2010

Поскольку метки времени будут отсортированы, вы можете попробовать что-то вроде Бинарный поиск с изюминкой.

Так как в основном строки не будут иметь одинаковую длину, вы можете просто искать определенное смещение, искать новые строки (или какой-либо другой терминатор строки), который появляется до и после (ИЛИ после и один ) после ) вы получаете строку кандидата. Теперь сравните дату в строке с той, которую вы ищете, и решите, искать ли снова, или просто осмотрите окрестности этой строки.

При определении того, какое смещение следует искать следующим, вы можете попытаться использовать что-то похожее на то, что делает Интерполяционный поиск , то есть решить смещение на основе разницы между временем полученной линии и временем, которое вы получили. ищем.

Это должно быть намного быстрее, чем линейный поиск.

Например, для выполнения бинарного поиска в файлах с использованием perl: http://perl.plover.com/yak/lightweight-db/materials/slides/slide024.html

0 голосов
/ 09 июня 2010

Имеет ли значение порядок вывода строк? Если вы не возражаете против их использования с самыми последними, вы можете использовать File :: ReadBackwards . Продолжайте читать в обратном направлении, пока линия не станет более одного часа, а затем остановитесь. Если вы хотите, чтобы они были в определенном порядке, вы можете хранить их в массиве и распечатывать их по своему усмотрению. (Предполагается, что это более или менее стандартный файл журнала с самыми последними записями в конце файла.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...