• Publicidad

Mostrar el contenido de una línea

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

Mostrar el contenido de una línea

Notapor riojita » 2014-03-14 08:06 @379

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!
riojita
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2014-03-14 07:50 @368

Publicidad

Re: Mostrar el contenido de una línea

Notapor explorer » 2014-03-14 09:40 @444

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
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

Re: Mostrar el contenido de una línea

Notapor riojita » 2014-03-14 11:53 @537

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.
Última edición por riojita el 2014-03-14 19:31 @855, editado 1 vez en total
riojita
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2014-03-14 07:50 @368

Re: Mostrar el contenido de una línea

Notapor explorer » 2014-03-14 12:55 @579

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.
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

Re: Mostrar el contenido de una línea

Notapor riojita » 2014-03-14 19:30 @854

Excelente, funcionó.

Realmente muchísimas gracias por la ayuda y la predisposición. ¡Un gran saludo!
riojita
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2014-03-14 07:50 @368


Volver a Básico

¿Quién está conectado?

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