• Publicidad

Expresión regular para manejar nombre de archivos

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Expresión regular para manejar nombre de archivos

Notapor MARKO » 2015-11-25 20:05 @879

Saludos, Perl en Español, de nuevo por acá con una duda.

Tengo 4 tipos de archivos:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
WEB13112015.xls ----------> programación diaria
WEB06062015R1_1201.xls ---> reprogramación diaria No.1
WEB07062015R2_0301.xls ---> reprogramación diaria No.2
WEB07062015R3_1101.xls ---> reprogramación diaria No.3
WEB23112015V1.xls --------> nueva versión de programación No.1
WEB23112015V2.xls --------> nueva versión de programación No.2
WEB23112015V3.xls --------> nueva versión de programación No.3
25_PDS20150614.xls -------> programación semanal
25_PDSREP20150614.xls ----> reprogramación semanal
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Elaboraré un sistema para analizar los diferentes tipos de archivo y quisiera ideas de cómo identificar a través de expresiones regulares cada tipo de archivo en base a su nombre para luego llamar a una rutina (que yo elaboraré) encargada de analizar cada tipo de archivo.

El resultado que me gustaría tener es en una $variable el resultado del análisis del nombre. Por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$variable = programación diaria
$variable = reprogramación diaria No.2
$variable = nueva versión No.3
$variable = programación semanal
$variable = reprogramación semanal
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Quisiera algunas ideas.

Para empezar, creo que la forma de hacerlo sería con expresiones regulares y conteo de caracteres.

¿¿¿Ideas???

Gracias por adelantado.
MARKO
Perlero nuevo
Perlero nuevo
 
Mensajes: 86
Registrado: 2012-01-10 22:34 @982

Publicidad

Re: Expresión regular para manejar nombre de archivos

Notapor explorer » 2015-11-26 17:30 @771

Se puede crear una serie de expresiones regulares para detectar cada nombre:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.22;
  3. use feature 'switch';
  4. no warnings 'experimental';
  5. use utf8::all;
  6.  
  7. my @pruebas = qw(
  8.     WEB13112015.xls
  9.     WEB06062015R1_1201.xls
  10.     WEB07062015R2_0301.xls
  11.     WEB07062015R3_1101.xls
  12.     WEB23112015V1.xls
  13.     WEB23112015V2.xls
  14.     WEB23112015V3.xls
  15.     25_PDS20150614.xls
  16.     25_PDSREP20150614.xls
  17. );
  18.  
  19. # gramática
  20. my $extensión  = qr/[.] xls                    /x;
  21. my $fecha       = qr/\d{8}                      /x;
  22. my $diario      = qr/WEB $fecha                 /x;
  23. my $reprograma  = qr/R (?<repro>  \d) _ \d{4}   /x;
  24. my $versión    = qr/V (?<version>\d)           /x;
  25. my $semanal     = qr/25_PDS    $fecha           /x;
  26. my $re_semanal  = qr/25_PDSREP $fecha           /x;
  27.  
  28. my %regexes = (
  29.     'programación diaria'              => qr/^ $diario             $extensión $/x,
  30.     'reprogramación diaria'            => qr/^ $diario $reprograma $extensión $/x,
  31.     'nueva versión de programación'   => qr/^ $diario $versión    $extensión $/x,
  32.     'programación semanal'             => qr/^ $semanal            $extensión $/x,
  33.     'reprogramación semanal'           => qr/^ $re_semanal         $extensión $/x,
  34. );
  35.  
  36. for my $prueba (@pruebas) {
  37.     keys %regexes;
  38.     while ( my ( $nombre, $regex ) = each %regexes ) {
  39.         if ( $prueba =~ $regex ) {
  40.             for ($nombre) {
  41.                 when ('reprogramación diaria') {
  42.                     $nombre .= " Nº $+{repro}";
  43.                 }
  44.                 when ('nueva versión de programación') {
  45.                     $nombre .= " Nº $+{version}";
  46.                 }
  47.             }
  48.             say "$prueba => $nombre";
  49.             last;
  50.         }
  51.     }
  52. }
  53.  
  54. __END__
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

La salida es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
WEB13112015.xls => programación diaria
WEB06062015R1_1201.xls => reprogramación diaria Nº 1
WEB07062015R2_0301.xls => reprogramación diaria Nº 2
WEB07062015R3_1101.xls => reprogramación diaria Nº 3
WEB23112015V1.xls => nueva versión de programación Nº 1
WEB23112015V2.xls => nueva versión de programación Nº 2
WEB23112015V3.xls => nueva versión de programación Nº 3
25_PDS20150614.xls => programación semanal
25_PDSREP20150614.xls => reprogramación semanal
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Esta es otra opción:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use feature 'say';
  3.  
  4. my @pruebas = qw(
  5.     WEB13112015.xls
  6.     WEB06062015R1_1201.xls
  7.     WEB07062015R2_0301.xls
  8.     WEB07062015R3_1101.xls
  9.     WEB23112015V1.xls
  10.     WEB23112015V2.xls
  11.     WEB23112015V3.xls
  12.     25_PDS20150614.xls
  13.     25_PDSREP20150614.xls
  14. );
  15.  
  16. my $variable;
  17.  
  18. for my $prueba (@pruebas) {
  19.  
  20.     if ($prueba
  21.            =~   /
  22.                 ^                                       # inicio de texto
  23.                 (?:
  24.                     (?<semanal>25_PDS(?<repsem>REP)?)   # semanal
  25.                     |                                   # o
  26.                     WEB                                 # diario
  27.                 )
  28.                 \d{8}                                   # fecha
  29.                 (?:
  30.                     R(?<repdia>\d) _ \d{4}              # reprogramación
  31.                     |                                   # o
  32.                     V(?<version>\d)                     # version
  33.                     |                                   # o nada
  34.                 )
  35.                 [.] xls                                 # extensión
  36.                 $                                       # fin de texto
  37.                 /x
  38.     ) {
  39.         if ($+{'semanal'}) {
  40.             $variable = 'programación semanal';
  41.             if ($+{'repsem'}) {
  42.                 $variable = "re$variable";
  43.             }
  44.         }
  45.         elsif ($+{'repdia'}) {
  46.             $variable = "reprogramación diaria Nº $+{'repdia'}";
  47.         }
  48.         elsif ($+{'version'}) {
  49.             $variable = "nueva versión de programación Nº $+{'version'}";
  50.         }
  51.         else {
  52.             $variable = "programación diaria";
  53.         }
  54.  
  55.         say "$prueba => $variable";
  56.     }
  57. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 7 invitados