• Publicidad

Extraer tabuladores de cadena

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

Extraer tabuladores de cadena

Notapor silva » 2011-05-24 06:05 @295

¡¡Hola!!

Tengo una cadena de caracteres, la que deseo limpiar :
1) Sacar todo carácter inicial de la cadena que no sea letra.
2) Sacar todos los \t \r \n que se encuentren en el interior o en el final de la cadena.

¿Podrían ayudarme? Gracias
silva
Perlero nuevo
Perlero nuevo
 
Mensajes: 82
Registrado: 2011-05-24 05:59 @291

Publicidad

Re: Extraer tabuladores de cadena

Notapor explorer » 2011-05-24 07:12 @341

Bienvenido a los foros de Perl en español, silva.

Esto se podría resolver con una expresión regular, pero antes deberías explicar a qué te refieres con "sacar".

¿Quieres extraer saber si están y cuáles son los caracteres extraídos, o quieres que se quiten de la cadena original?

Si tienes algún código hecho, es mejor publicarlo.
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: Extraer tabuladores de cadena

Notapor silva » 2011-05-24 07:34 @357

Tengo una cadena, de la cual quiero extraer partes como nombres, valores, pero en dicha cadena aparecen al comienzo, entre medio y al final tabuladores, control de líneas. Si bien al hacer un print() de la cadena no aparecen si están presentes:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. my $cadena = '    
  2. juana lopes  3459087  24 años   
  3. soltero   
  4.   '; 
  5. # De dicha cadena quisiera hacer: 
  6. ($nombre, $documento, $edad ....) = =~ m/ .....(\d+)\s+; 
  7.  
  8. # Pero en dicha cadena aunque no se vean hay \n, \t, espacios, que no me permiten obtener los valores que busco. 


Muy agradecido
silva
Perlero nuevo
Perlero nuevo
 
Mensajes: 82
Registrado: 2011-05-24 05:59 @291

Re: Extraer tabuladores de cadena

Notapor explorer » 2011-05-24 09:25 @434

Si las posiciones de nombre, documento, edad, están separados por un preciso número de separadores (los tabuladores, por ejemplo), entonces solo tienes que indicarlo en la expresión regular.

Lo que no nos dices es cómo están separados, dónde están los delimitadores, qué delimitadores hay entre cada par de valores...

De todas maneras, con la clase \s+ en las expresiones regulares, puedes indicar que buscas por cualquier espacio en blanco, así que, todo lo demás, será la información que buscas.
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: Extraer tabuladores de cadena

Notapor silva » 2011-05-25 09:23 @432

La cadena está compuesta por subcadenas de datos importantes que extraer de la misma.
Pero sucede que al inicio, al final y entre medio de dichas SUBCADENAS de datos que quiero extraer aparecen caracteres que no me interesan, como "\r", "\n" y gran cantidad de espacios.

Sintáxis: [ Descargar ] [ Ocultar ]
  1. # Suponiendo la siguiente cadena necesito obtener las variables $nombre y $edad solamente, eliminando todo otro carácter existente:  
  2.  
  3. my $cadena = '  \n  espacios  \n  \n juan Peres \n  24  \n \n '; 
  4.  


Donde $nombre tome SOLO los 10 caracteres que lo conforman, y $edad tome el valor de 24 sin ningún tipo de carácter no numérico o espacio.

Muy agradecida.
silva
Perlero nuevo
Perlero nuevo
 
Mensajes: 82
Registrado: 2011-05-24 05:59 @291

Re: Extraer tabuladores de cadena

Notapor panterozo » 2011-05-25 12:17 @553

Hola Silva:

Yo lo hice así...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $cadena = '  \n                           \n  \n juan Peres \n  24  \n \n ';
  2. print "\nCadena Original:\n-->".$cadena."<--\n";
  3. $cadena =~ s/\\n//g;
  4. $cadena =~ s/\\r//g;
  5. print "\nCadena sin los caracteres \\n \\r:\n-->".$cadena."<--\n\n";
  6. if($cadena =~ /((\w+)[ ]+(\w+)?)[ ]+(\d+)/){
  7.         print "Nombre: ".$1."\nEdad: ".$4."\n";
  8. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


donde $1 es el nombre y el apellido (si tiene). Claro está que se acomoda a la cadena principal, pero cuando se hace una expresión regular para obtener los datos hay que tener mucho cuidado.

Espero sirva
¡¡¡Saludos!!!
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Re: Extraer tabuladores de cadena

Notapor panterozo » 2011-05-25 12:26 @560

Viendo el mensaje anterior, y para utilizar una expresión regular similar, se le quitan los \n \r \t que pueda presentar el string...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $cadena = '    
  2. juana lopes  3459087  24 años  
  3. soltero  
  4.  ';
  5. my $fh = undef;
  6. open($fh,"<",\$cadena);
  7. my $aux = '';
  8. while(<$fh>){
  9.         $_ =~ s/\n//g;
  10.         $_ =~ s/\t//g;
  11.         $_ =~ s/\r//g;
  12.         $aux .= $_;
  13. }
  14. print $aux;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


pasando el string a un array...


o directamente, sin pasarlo a un array...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $cadena = '    
  2. juana lopes  3459087  24 años  
  3. soltero  
  4.  ';
  5. $cadena =~ s/\n//g;
  6. print $cadena;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Web útil

¡¡¡Saludos!!!
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Re: Extraer tabuladores de cadena

Notapor explorer » 2011-05-25 13:35 @608

Esta es mi versión:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use Modern::Perl;                       # somos modernos
  3. use utf8;                               # este programa está escrito en utf8
  4. #use autodie;                           # es mejor morir que regresar con deshonor (proverbio Klingon)
  5.  
  6. my $cadena = "    \n           juana lopes  3459087  24 años \n soltero     \n   \n";
  7.  
  8. my ($nombre, $id, $edad, $estado)
  9.     = $cadena =~ m/\s+ ([\w\s]+?) \s+ (\d+) \s+ (\d+) \s+ años \s+ (\w+)/x;
  10.  
  11. say "[$nombre, $id, $edad, $estado]";
  12.  
  13. __END__
  14. [juana lopes, 3459087, 24, soltero]
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

La expresión regular tiene activada la opción /x para escribirla con espacios y que sea más fácil de leer.

Los paréntesis de captura, guardan cada captura y la envían a las variables que declaramos con el my().

"\s+" se "come" todos los espacios en blanco. Eso incluye a "\n", "\r" y "\t". Mientras, "\w" busca por caracteres alfanuméricos, y "\d" por caracteres numéricos.

Un valor fundamental es el de la palabra "años", que la exp. reg. usará para hacer coincidir el resto de los campos.

La exp. regular no está optimizada, por lo que no valdría para procesar grandes volúmenes de información (llevaría mucho tiempo). Haría falta un poco más de información de la entrada. Por ejemplo, si supiéramos que los campos interesantes comienzan todos ellos siempre en las mismas columnas.
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: Extraer tabuladores de cadena

Notapor panterozo » 2011-05-25 16:10 @715

explorer escribiste:es mejor morir que regresar con deshonor (proverbio Klingon)


Y la opción /x, que no la conocía, genial ;)
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Re: Extraer tabuladores de cadena

Notapor erv-Z » 2011-05-25 17:32 @772

Aquí mi versión, solo con un patrón distinto a la de explorer.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. my $string = "    \n    \r JuanA loPes
  4. 3459087  24
  5. años \n
  6. soltero    
  7. \n   \n";
  8.  
  9.  
  10. my ($nombre, $id, $edad, $status) = $string =~ m/(?i)(?:[^\w]+)(\w+\s\w+)(?:[^\d]+)(\d+)\s+(\d{1,3})(?:[^años]+)años(?:[^\w]+)(\w+)(?-i)/;
  11.  
  12. print "$nombre, $id, $edad, $status"."\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
erv-Z
Perlero nuevo
Perlero nuevo
 
Mensajes: 158
Registrado: 2009-07-25 13:00 @583

Siguiente

Volver a Básico

¿Quién está conectado?

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