Perl: extracción de fecha de una string usando Regex

En Perl , generalmente, tenemos que leer archivos CSV (valores separados por comas) para extraer los datos requeridos. A veces hay fechas en el nombre del archivo como ejemplo 2014-02-12T11:10:10.csv o podría haber una columna en un archivo que tenga una fecha. Estas fechas pueden tener cualquier patrón como YYYY-MM-DDThh:mm:ss o dd/mm/yyyy hh.mm.ss . Para manejar esas fechas; los scripts de Perl deben ser lo suficientemente flexibles para manejar diferentes tipos de formatos de fecha en una string. Necesitamos usar la función de expresión regular para extraer fechas de una string. Una expresión regular es una string de caracteres que define el patrón o patrones específicos que está viendo. El método básico para aplicar una expresión regular es utilizar los operadores de vinculación de patrones =~ y !~. 

En Perl hay varias bibliotecas disponibles para manejar la fecha y la hora, como Date::Parse y Time::Piece; ambas bibliotecas vienen con muchas funciones flexibles para manejar los requisitos más complejos. Pero estas bibliotecas no forman parte de los módulos estándar de Perl, debe instalarlas por separado.

Para formatos de fecha generales, es bueno encontrar expresiones regulares específicas sin instalar ninguna biblioteca nueva. Veamos algunos ejemplos de análisis de una fecha de una string en Perl.

Antes de ver ejemplos para extraer la fecha de una string, debemos mirar estos metasímbolos que se usan para analizar una expresión en una string:

^ el metacarácter coincide con el comienzo de la string
ps  metasímbolo coincide con el final de la string
* coincide con 0 o más apariciones de la expresión anterior
+ coincide con 1 o más ocurrencias de la expresión anterior
? coincide con 0 o 1 aparición de la expresión anterior

Aquí hay algunos ejemplos breves.

/^$/ # nada en la string (el inicio y el final son adyacentes)
/(\d\s) {3}/ tres dígitos, cada uno seguido de un espacio en blanco. Por ejemplo: 6 7 8 
/(a.)+/   coincide con una string en la que cada letra siguiente es una
/^\d+/ la string comienza con uno o más dígitos
/\d+$/ la string termina con uno o más dígitos

No se requiere un módulo separado para la expresión regular. Está integrado en Perl (cualquier versión). Por lo tanto, debe tener Perl (cualquier versión) instalado en su sistema. Veremos algunos ejemplos para extraer la fecha, en un formato diferente, de una string usando Perl regex.

Ejemplo 1:

En este ejemplo veremos cómo extraer fecha con patrón, aaaa-mm-ddThh:mm:ss, de una string en Perl. El siguiente ejemplo 1 muestra una string sample2018-03-21T12:10:10.csv de la que necesitamos extraer la fecha en las variables de año, mes y fecha para que se pueda utilizar para más secuencias de comandos. 

Aquí, la expresión regular \d\d\d\d asegura que el patrón de fecha en la string debe comenzar con el patrón de 4 dígitos. De lo contrario, puede generar una excepción de variable no inicializada debido a que falta un patrón en la string.

¿Qué significa /d?/d? Este patrón asegura que el mes, el día, las horas, los minutos y los segundos puedan estar en 1 o 2 dígitos. 

Por ejemplo:   

2013-9-21T11:3:30

2014-12-3T9:1:10

Entonces /d?/d asegurará que la expresión dejada a ? es opcional y se ejecutará sin ningún error.

Perl

#!/usr/bin/perl
# your code here
my $str = "sample2018-03-21T12:10:10.csv";
my (($year, $month, $day, $hour, $min, $sec) = 
     $str =~ /(\d\d\d\d)-(\d?\d)-(\d?\d)T(\d?\d):(\d?\d):(\d?\d)/);
print "year : $year  month:$month  day:$day - hour:$hour  minute:$min  seconds:$sec\n";

Producción:

year : 2018  month:03  day:21 - hour:12  minute:10  seconds:10

Ejemplo 2:

En este ejemplo, veremos cómo extraer la fecha con el patrón mm/dd/yyyy hh.mm.ss de una string. La fecha puede ser parte del nombre del archivo o podría ser un contenido. Entonces, el siguiente ejemplo ayudará a analizar la fecha con el formato mm/dd/aaaa hh:mm:ss de una string. En este ejemplo hemos tomado una string test_28/04/2017 11.00.00 ; donde fecha comienza con 2 dígitos 28 seguido de barra invertida / 

Aquí, (\d?\d) regex asegura que la string comenzará con el patrón con 2 o 1 dígito seguido de /. La barra invertida \ se coloca delante del . para asegurarse de que solo coincida con los puntos y no con todos los caracteres como suele hacerlo.

Perl

#!/usr/bin/perl
# your code here
my $str1 = "test_28/04/2017 11.00.00";
my (($month1, $day1, $year1, $hour1, $min1, $sec1) = 
     $str1 =~ m{(\d?\d)/(\d?\d)/(\d\d\d\d) (\d\d)\.(\d\d)\.(\d\d)}); 
print "year:$year1  month:$month1  day:$day1 - hour:$hour1  minute:$min1  seconds:$sec1\n";

Producción:

year:2017  month:28  day:04 - hour:11  minute:00  seconds:00

Ejemplo 3:

Aquí veremos un patrón de fecha más que es {Day}, dd {mon} aaaa hh:mm:ss como el martes, 11 de febrero de 2014 11:01:54 +0100 (CET); A veces, los archivos CSV tienen un valor de columna de fecha en un formato anterior que no es legible para las operaciones de Perl, por lo que queremos extraer el año, el mes y la fecha de este formato y usarlo según sea necesario. 

Aquí, .+?(\d+) expresión regular significa que habría algunos caracteres antes de los dígitos de fecha 11, después de eso \s(.+?) expresión regular significa que la fecha es seguida por un espacio y una string de caracteres que es Feb, s(\d+ )/ regex asegura que el 11 de febrero sea seguido por un espacio y varios dígitos que son 2014. Guardamos estos valores en las variables definidas para día, mes y año; que se puede utilizar en la secuencia de comandos adicional.

Perl

#!/usr/bin/perl
# your code here
my $string = 'Date: Tue, 11 Feb 2014 11:01:57 +0100 (CET)';
my ($day3, $month3, $year3) = $string =~ /Date:.+?(\d+)\s(.+?)\s(\d+)/;
print "Day:$day3 month:$month3 year:$year3\n";

Producción:

Day:11 month:Feb year:2014

Publicación traducida automáticamente

Artículo escrito por prernadec y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *