Página 1 de 1

Cómo extraer ciertos datos en un bucle

NotaPublicado: 2014-01-29 09:27 @435
por coltx
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

Re: Cómo extraer ciertos datos en un bucle

NotaPublicado: 2014-01-29 09:45 @448
por explorer
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

Re: Cómo extraer ciertos datos en un bucle

NotaPublicado: 2014-01-29 11:30 @520
por coltx
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.

Re: Cómo extraer ciertos datos en un bucle

NotaPublicado: 2014-01-29 17:19 @763
por explorer
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".

Re: Cómo extraer ciertos datos en un bucle

NotaPublicado: 2014-01-29 19:32 @856
por coltx
Eso mismo es, explorer. Gracias.

Re: Cómo extraer ciertos datos en un bucle

NotaPublicado: 2014-01-31 16:44 @739
por explorer
Pues hay un problema... en el código que has puesto, la marca <div class="Empresa"> no tiene marca </div> de cierre...

Re: Cómo extraer ciertos datos en un bucle

NotaPublicado: 2014-02-18 12:11 @549
por coltx
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,

Re: Cómo extraer ciertos datos en un bucle

NotaPublicado: 2014-03-07 10:39 @485
por coltx
¿A alguien se le ocurre cómo puedo obtener los datos de esa manera?


Gracias.

Re: Cómo extraer ciertos datos en un bucle

NotaPublicado: 2014-03-07 16:39 @736
por explorer
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.