Как я могу конвертировать дату в эпоху? - PullRequest
2 голосов
/ 02 марта 2011

У меня огромный отформатированный файл вида:

29/01/2010 18:00 string1 string2 .....

30/01/2010 18:30 string3 string4 .....

...

...

dd/mm/yyyy hh:MM strings strings....

Мне нужно выполнить некоторые статистические данные на основе дат.

Итак, я хотел бы заменить строку dd/mm/yyyy hh:MM временем эпохи в файле для выполнения простых манипуляций.

Полагаю, лучше всего использовать Perl, но я действительно не знаю, с чего начать. Есть намеки?

Ответы [ 3 ]

4 голосов
/ 02 марта 2011

Только что? Этот быстрый и грязный однострочник должен сделать:

perl -MPOSIX -pwe 's{^(\d{2})/(\d{2})/(\d{4}) (\d{2}):(\d{2}) }{mktime(0,$5,$4,$1,$2-1,$3-1900)." "}e;'

Подайте файл на стандартный ввод, и он выведет измененную версию на стандартный вывод. Все, что он делает, это ищет строки, которые имеют «дд / мм / гггг чч: мм» в начале, и передает компоненты даты в функцию mktime из модуля POSIX, чтобы получить метку времени Unix.

2 голосов
/ 02 марта 2011
use DateTime::Format::Strptime;

my $Strp = new DateTime::Format::Strptime(
        pattern     => '%d/%m/%Y %H:%M',
        locale      => 'en_EN',
        time_zone   => 'UTC',
);

open INPUT, $file;
while (<INPUT>)
{
   my ($date, $time, $foo) = split(' ', $_, 3);
   my $dt = $Strp->parse_datetime("$date $time");
   printf "%s %s", $dt->strftime('%s'), $foo;
}
close INPUT;
1 голос
/ 02 марта 2011

Вы можете использовать основной модуль Время :: Локальный

#!/usr/bin/perl
use 5.10.1;
use strict;
use warnings;
use Time::Local;


while(<DATA>) {
    if (m#(\d+)/(\d+)/(\d+)\s+(\d+):(\d+)\s#) {
        say timelocal(0,$5,$4,$1,$2-1,$3);
    }
}

__DATA__
29/01/2010 18:00 string1 string2 .....

30/01/2010 18:30 string3 string4 .....

Выход:

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