Página 1 de 1

Mostrar el contenido de una línea

NotaPublicado: 2014-03-14 08:06 @379
por riojita
Hola a todos.

Soy nuevo en Perl, y tengo una consulta. Espero puedan ayudarme.

Tengo las siguiente líneas (nunca son igual, algunas tienen más campos, otras menos):
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
-Encuesta=Completa,Telefono=Motorola,Televisor=Sony,Computadora=IBM,Ropa=Levis
-Encuesta=Completa,Telefono=Samsung,Televisor=LG,Computadora=HP,Ropa=Lacosta,Auto=Ford,Auriculares=Sony
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Y lo que necesito es ver todo ese contenido luego del primer '=' en un campo.

O sea, debería quedar así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
@Datos=Completa,Telefono=Motorola,Televisor=Sony,Computadora=IBM,Ropa=Levis
@Datos=Completa,Telefono=Samsung,Televisor=LG,Computadora=HP,Ropa=Lacosta,Auto=Ford,Auriculares=Sony
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Tengo hecho lo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. # array campos
  2. $num_elementos = split( $valor, campos, "=" )
  3.     if ( match( campos [1], "-Encuesta" ) ) {
  4.     @Datos = campos [2];
  5. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Pero si hago eso el resultado es el siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
@Datos=Completa,Telefono
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Y entiendo que es debido a que como hago split() por '=' se corta hasta el siguiente '='.

Se me ocurrió hacer lo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ( match( campos [1], "-ObjectOfReference" ) ) {
  2.     @Datos = campos [2] +"=" + campos [3] +"=" + campos [4] +"=" + campos [5] +"=" + campos [6] +"=" + campos [7];
  3. }
  4.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Si bien funciona, hay un problema: que cuando la línea es más corta, por ejemplo solo esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
@Encuesta=Completa,Telefono=Motorola
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

El resultado sería:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
@Datos=Completa,Telefono=Motorola=====
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

O sea, se me completaría con muchos '=' debido a que los otros campos están vacíos.


¿Me podrían ayudar?

Cualquier cosa que no se entienda por favor consúltenme.
¡Gracias desde ya a todos!

Re: Mostrar el contenido de una línea

NotaPublicado: 2014-03-14 09:40 @444
por explorer
Bienvenido a los foros de Perl en Español, riojita.

Eso se resuelve fácil indicando a split() cuántas veces queremos que realice el 'corte':
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $valor  = '-Encuesta=Completa,Telefono=Motorola,Televisor=Sony,Computadora=IBM,Ropa=Levis';
  2.  
  3. my @campos = split(/[=]/, $valor, 2);
  4.  
  5. if ($campos[0] eq '-Encuesta') {
  6.     $datos = $campos[1];
  7. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Re: Mostrar el contenido de una línea

NotaPublicado: 2014-03-14 11:53 @537
por riojita
Ante todo ¡gracias por responder! Realmente muy agradecido.

Creo que no se entendió bien mi consulta.

Yo tengo un archivo .log con muchas líneas de este estilo:
-Encuesta=Completa,Telefono=Motorola,Televisor=Sony,Computadora=IBM,Ropa=Levis
-Encuesta=Completa,Telefono=Samsung,Televisor=LG,Computadora=HP,Ropa=Lacosta,Auto=Ford,Auriculares=Sony
-Encuesta=Completa,Telefono=Iphone,Televisor=Samsung,Computadora=Compaq


Pero no son siempre iguales, sino que pueden cambiar, a veces traen menos campos, a veces más. Pero lo que sí es igual que son del tipo -Item1=Valor,Item2=Valor2,Item3=Valor3 ....

Yo ahora tengo un script que procesa ese log, y mapea lo que quiero en diferentes campos de una base de datos y entre otras cosas que hace, está la parte que procesa esas líneas de esta manera:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. array campos
  2. $num_elementos = split( $valor, campos, "=" )
  3.     if ( match( campos [1], "-Encuesta" ) ) {
  4.     @Datos = campos [2];
  5. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


@Datos es el nombre de uno de los campos de mi base de datos donde necesito que se vea lo que proceso.

Si, por ejemplo la línea es así de corta:
-Encuesta=Completa


Eso funciona perfecto ya que hay un solo valor luego del "=". O sea, yo tengo una base de datos con campos, y allí se mapea lo que está en la linea:
@Campodemibase=Completa

El problema es cuando la línea es más larga, que tiene más "=".

¿Me explico?
Perdón si estoy olvidando algo, ya que tampoco entiendo mucho cómo está armado el script. Sé que me estaría faltando algo como decirle que me tome la línea entera.

Mil gracias nuevamente.

Re: Mostrar el contenido de una línea

NotaPublicado: 2014-03-14 12:55 @579
por explorer
Vale, entonces lo que hay que hacer es: primero partir la línea por las comas, y luego por los '=':

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $linea = '-Encuesta=Completa,Telefono=Motorola,Televisor=Sony,Computadora=IBM,Ropa=Levis';
  2.  
  3. my @campos = split(/[,]/, $linea);
  4.  
  5. my %datos;
  6.  
  7. for my $campo (@campos) {
  8.     my($variable, $valor) = split(/[=]/, $campo);
  9.     $datos{$variable} = $valor;
  10. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

El resultado queda en un hash, para que puedas referirte a cada campo por su nombre, en lugar de por su número. Así, no dependes del orden y número de campos que recibas.

Re: Mostrar el contenido de una línea

NotaPublicado: 2014-03-14 19:30 @854
por riojita
Excelente, funcionó.

Realmente muchísimas gracias por la ayuda y la predisposición. ¡Un gran saludo!