• Publicidad

Cómo extraer ciertos datos en un bucle

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

Cómo extraer ciertos datos en un bucle

Notapor coltx » 2014-01-29 09:27 @435

Hola, estimados. Quisiera su ayuda nuevamente. Si bien tengo claro cómo recorrer un archivo txt y leer sus líneas, me he quedado entrampado ya que necesito extraer datos desde ciertos lugares del archivo. Un extracto del archivo es el siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1.                        <div class="Empresa">
  2.                         <div class="Nombre">Empresa prueba</div>
  3.                         <div class="Telefono">22222</div>
  4.                         <div class="Telefono">33333</div>
  5.                         <div class="Direccion">direccion, ciudad, país</div>
  6.                         <div class="Pais">Pais</div>
  7.                         <div style="width:492px; float:left;">
  8.                         <br>
  9.                        </div>
  10.                        <div style="clear: both"></div>
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Los valores que necesito sacar son:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Empresa prueba
22222
33333
direccion, ciudad, país
Pais
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Favor su ayuda, en alguna expresión regular (se me ocurre) serviría para extraer esos datos.

Desde ya, muchas gracias
coltx
Perlero nuevo
Perlero nuevo
 
Mensajes: 79
Registrado: 2011-09-16 08:01 @376

Publicidad

Re: Cómo extraer ciertos datos en un bucle

Notapor explorer » 2014-01-29 09:45 @448

Con unas pocas expresiones regulares, sale bien:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. $ perl -nlE 'chomp; s/<\/?.+?>\s*//g; s/^\s+//; s/\n+/\n/; next if $_ eq ""; print' kk.html
  2. Empresa prueba
  3. 22222
  4. 33333
  5. direccion, ciudad,
  6. país
  7. Pais
  8.  
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: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Cómo extraer ciertos datos en un bucle

Notapor coltx » 2014-01-29 11:30 @520

explorer, gracias por tu respuesta, pero ¿cómo puedo con el mismo comando generar los datos en una línea separados por el carácter "|" y con un carácter de fin de línea al final teniendo en cuenta que podría ser más de un conjunto de esos datos?

Gracias.
coltx
Perlero nuevo
Perlero nuevo
 
Mensajes: 79
Registrado: 2011-09-16 08:01 @376

Re: Cómo extraer ciertos datos en un bucle

Notapor explorer » 2014-01-29 17:19 @763

A ver... hay que explicar todo el problema, y con detalle, porque si no, no acabamos nunca.

Por ejemplo, ¿qué aspecto tiene lo de "más de un conjunto de datos"? ¿Qué es lo que separa un conjunto de otro? Necesitamos saber qué podemos usar para saber que separa o qué inicia un conjunto de datos.

¿Es, acaso, decir que cada conjunto de datos está contenido en una capa de clase "Empresa"? Entonces diremos que "los datos están en una página HTML y necesitamos generar una fila de datos por cada capa "Empresa".
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Cómo extraer ciertos datos en un bucle

Notapor coltx » 2014-01-29 19:32 @856

Eso mismo es, explorer. Gracias.
coltx
Perlero nuevo
Perlero nuevo
 
Mensajes: 79
Registrado: 2011-09-16 08:01 @376

Re: Cómo extraer ciertos datos en un bucle

Notapor explorer » 2014-01-31 16:44 @739

Pues hay un problema... en el código que has puesto, la marca <div class="Empresa"> no tiene marca </div> de cierre...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Cómo extraer ciertos datos en un bucle

Notapor coltx » 2014-02-18 12:11 @549

Tienes razón, explorer. Ahora va el código completo, toma en cuenta que este bloque se repite n veces...

Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <div class="Empresa">
  2.  <div class="Nombre">Nombre Prueba</div>
  3.  <div class="Telefono">Telefono Prueba</div>
  4.  <div class="Telefono">Telefono Prueba Dos</div>
  5.  <div class="Direccion">Direccion Prueba</div>
  6.  <div class="Pais">Pais Prueba</div>
  7.  <div style="width:492px; float:left;">                                                                                                                                                                                              <br>                                                                                                                                                      
  8.  </div>
  9.  <div style="clear: both"></div>
  10. </div>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Lo que yo quiero obtener es algo más o menos así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Nombre Prueba;Telefono Prueba;Telefono Prueba Dos;Direccion Prueba;Pais Prueba
línea 2...
línea 3...
etc.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

según cuántos bloques sean.

Saludos,
coltx
Perlero nuevo
Perlero nuevo
 
Mensajes: 79
Registrado: 2011-09-16 08:01 @376

Re: Cómo extraer ciertos datos en un bucle

Notapor coltx » 2014-03-07 10:39 @485

¿A alguien se le ocurre cómo puedo obtener los datos de esa manera?


Gracias.
coltx
Perlero nuevo
Perlero nuevo
 
Mensajes: 79
Registrado: 2011-09-16 08:01 @376

Re: Cómo extraer ciertos datos en un bucle

Notapor explorer » 2014-03-07 16:39 @736

Esta es una forma de hacerlo. Si suponemos que la estructura de los datos es siempre la misma (consistente), entonces podemos construir una serie de reglas de patrones de expresiones regulares con los que podemos identificar cada registro de Empresa, y los campos que contiene, y luego sacarlos a la salida.

Si partimos de este archivo de ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <div class="Empresa">
  2.  <div class="Nombre">Nombre1 Prueba</div>
  3.  <div class="Telefono">Telefono1 Prueba</div>
  4.  <div class="Telefono">Telefono1 Prueba Dos</div>
  5.  <div class="Direccion">Direccion1 Prueba</div>
  6.  <div class="Pais">Pais1 Prueba</div>
  7.  <div style="width:492px; float:left;">                                                                                                                                                                                              <br>                                                                                                                                                      
  8.  </div>
  9.  <div style="clear: both"></div>
  10. </div>
  11.  
  12. <div class="Empresa">
  13.  <div class="Nombre">Nombre2 Prueba</div>
  14.  <div class="Telefono">Telefono2 Prueba</div>
  15.  <div class="Telefono">Telefono2 Prueba Dos</div>
  16.  <div class="Direccion">Direccion2 Prueba</div>
  17.  <div class="Pais">Pais2 Prueba</div>
  18.  <div style="width:492px; float:left;">                                                                                                                                                                                              <br>                                                                                                                                                      
  19.  </div>
  20.  <div style="clear: both"></div>
  21. </div>
  22.  
  23. <div class="Empresa">
  24.  <div class="Nombre">Nombre3 Prueba</div>
  25.  <div class="Telefono">Telefono3 Prueba</div>
  26.  <div class="Telefono">Telefono3 Prueba Dos</div>
  27.  <div class="Direccion">Direccion3 Prueba</div>
  28.  <div class="Pais">Pais3 Prueba</div>
  29.  <div style="width:492px; float:left;">                                                                                                                                                                                              <br>                                                                                                                                                      
  30.  </div>
  31.  <div style="clear: both"></div>
  32. </div>
  33.  
  34. <div class="Empresa">
  35.  <div class="Nombre">Nombre4 Prueba</div>
  36.  <div class="Telefono">Telefono4 Prueba</div>
  37.  <div class="Telefono">Telefono4 Prueba Dos</div>
  38.  <div class="Direccion">Direccion4 Prueba</div>
  39.  <div class="Pais">Pais4 Prueba</div>
  40.  <div style="width:492px; float:left;">                                                                                                                                                                                              <br>                                                                                                                                                      
  41.  </div>
  42.  <div style="clear: both"></div>
  43. </div>
  44.  
  45. <div class="Empresa">
  46.  <div class="Nombre">Nombre5 Prueba</div>
  47.  <div class="Telefono">Telefono5 Prueba</div>
  48.  <div class="Telefono">Telefono5 Prueba Dos</div>
  49.  <div class="Direccion">Direccion5 Prueba</div>
  50.  <div class="Pais">Pais5 Prueba</div>
  51.  <div style="width:492px; float:left;">                                                                                                                                                                                              <br>                                                                                                                                                      
  52.  </div>
  53.  <div style="clear: both"></div>
  54. </div>
  55.  
  56.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Entonces, con este programa
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use autodie;
  4.  
  5. use File::Slurp;
  6.  
  7. my $archivo_html = read_file('code_36794.html');
  8.  
  9. ## Definición de las reglas
  10. my $nombre      = qr{<div class="Nombre">(?<nombre>.+?)</div>\s*};
  11. my $telefono    = qr{<div class="Telefono">(?<telefono>.+?)</div>\s*};
  12. my $direccion   = qr{<div class="Direccion">(?<direccion>.+?)</div>\s*};
  13. my $pais        = qr{<div class="Pais">(?<pais>.+?)</div>\s*};
  14. my $empresa     = qr{<div class="Empresa">\s*$nombre(?<telefonos>$telefono+)$direccion$pais};
  15.  
  16. ## Proceso
  17. while ($archivo_html =~ /$empresa/gs) {
  18.  
  19.     # encontrada una empresa. Sacamos los campos encontrados
  20.     my($nombre, $telefonos, $direccion, $pais) = @+{ qw( nombre telefonos direccion pais ) };
  21.  
  22.     my @telefonos = $telefonos =~ /$telefono/g;         # extracción de los teléfonos
  23.  
  24.     # salida del registro
  25.     say $nombre;
  26.     say for @telefonos;
  27.     say $direccion;
  28.     say $pais;
  29.     say '=' x 50;
  30. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
el resultado es
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Nombre1 Prueba
Telefono1 Prueba
Telefono1 Prueba Dos
Direccion1 Prueba
Pais1 Prueba
==================================================
Nombre2 Prueba
Telefono2 Prueba
Telefono2 Prueba Dos
Direccion2 Prueba
Pais2 Prueba
==================================================
Nombre3 Prueba
Telefono3 Prueba
Telefono3 Prueba Dos
Direccion3 Prueba
Pais3 Prueba
==================================================
Nombre4 Prueba
Telefono4 Prueba
Telefono4 Prueba Dos
Direccion4 Prueba
Pais4 Prueba
==================================================
Nombre5 Prueba
Telefono5 Prueba
Telefono5 Prueba Dos
Direccion5 Prueba
Pais5 Prueba
==================================================
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Usamos la marca de Empresa como inicio del registro, del que deben colgar todos los demás, y en exactamente ese orden. La único raro es el teléfono, que puede ser más de uno. Los capturamos todos de golpe, que más tarde, sacaremos uno a uno para meterlo en un array. Finalmente, lo sacamos todo, en el orden pedido.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
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 12 invitados