• Publicidad

Trocear columnas

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

Trocear columnas

Notapor inside3 » 2012-10-30 10:53 @495

Buenas,

Estoy analizando unos archivos y ahora me he encontrado con uno un poco particular, con una estructura así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
 USR    VADER, DARTH......   8871   7601                2011-01-30   2012-01-28
 USR2   SKYWALK, LUKE.....   2249   1200   2011-08-24   2011-08-21   2011-05-13
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Las columnas, como se aprecia, siempre van en la misma posición, es decir, tienen un tamaño fijo. La separación entre las columnas, son espacios (\s).

He intentado hacer algo como
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my($c1,$c2,$c3,$c4,$c5,$c6,$c7) = split /\s+, $_;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Pero no funciona, ya que la columna nº 2, siempre contiene algún espacio entre sus datos. Además, también hay columnas que pueden aparecer sus datos.

Después he estado trasteando con expresiones regulares, pero no consigo dar con una que me funcione :?

He intentado usar unpack(), pero sin éxito también, ya que la longitud de cada columna es diferente, y no puedo decirle que me trocee por campos ASCII de x caracteres >.<

Lo único que se me ha ocurrido es crear un array por línea, y acceder a los elementos $array[$inicio_columna] - $array[$fin_columna] ... y el código estaba quedando sencillamente horrible.

¿Se os ocurre alguna forma mejor para hacerlo teniendo en cuenta que las columnas siempre empiezan en la misma posición?
inside3
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2012-10-30 10:38 @485

Publicidad

Re: Trocear columnas

Notapor explorer » 2012-10-30 11:02 @501

Bienvenido a los foros de Perl en Español, inside3.

Si las columnas empiezan siempre en la misma posición, la solución es siempre usar unpack() (salvo algunos pocos casos).

Muestra tu código con unpack(), y dinos dónde te da el problema.
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: Trocear columnas

Notapor inside3 » 2012-10-30 12:00 @541

Sólo había usado unpack() en una ocasión, y desde luego no era consciente de las cosas que se pueden hacer con él :o el caso es que estaba mirando documentación de unpack() y todo me parecía bastante críptico, no lo comprendía muy bien...

Creía que solo se le podía especificar una agrupación de caracteres... vaya iluso :lol:

Resulta que al final era bastante simple la solución a mi problema,

He solucionado la papeleta haciendo esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @campos = unpack "(A8)(A27)....*", $linea;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


(donde los puntos suspensivos son más agrupaciones () del número de caracteres que me interesan)

Gracias de todas formas, ¡lo pongo por si a alguien le puede servir en el futuro!
inside3
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2012-10-30 10:38 @485

Re: Trocear columnas

Notapor explorer » 2012-10-30 14:12 @633

No necesitas los paréntesis, dentro de la cadena de caracteres de formato. Solo son necesarios para indicar repeticiones de grupos.
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


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado