• Publicidad

Revisar un archivo

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

Revisar un archivo

Notapor Rene Serrano » 2008-02-11 16:19 @721

Buen día, todos. Tengo un problemita. Tengo un archivo con un formato dado, Ok, y tengo que verificar un columna específica y luego generar otro archivo con esa verificación.
Código: Seleccionar todo
  0004 4135 empleado        15        264.00    125.71                           138.29    122.00     264.00     264.00      7.92      15.84       15.77       0.00       0.00      34.60                189.87
  0004 4169 empleado        15        264.00    264.00                            17.60      0.00     281.60     281.60      8.45      16.90       17.42       0.00       0.00      30.09                208.74
  0004 4208 empleado        15        114.29    114.29      60.00      28.57               148.58     351.44     351.44     10.29      21.09       23.99       0.00       0.00       0.00                296.07
  0004 4213 empleado        15        114.29    114.29      47.62      47.62       7.62    254.00     217.15     217.15      6.51      13.03        6.96      12.50       0.00       0.00      22.85     155.30
  0004 4223 empleado        15        114.29    114.29      23.81       2.38                 0.00     140.48     140.48      4.21       8.78                  24.50       0.00       0.00                102.99
  0004 4232 empleado        15        200.00    200.00                            13.33      0.00     213.33     213.33      6.40      12.80        6.60       0.00       0.00       0.00      33.33     154.20
  0004 4243 empleado        0         211.43      0.00                                       0.00       0.00                 0.00       0.00                   0.00       0.00       0.00

Ese el formato pero tengo que verificar la columna 9 si tiene valor diferente de 0.00. Esa línea tiene que ir en otro archivo. Cómo puedo hacer para meterlo dentro de un arreglo ya que si nos fijamos hay columnas que no tiene datos. Eso cómo para hacer un split, a ver si me ayudan.

He estado intentando hacerlo con expresiones regulares pero sigo sin conseguirlo.

Saludos.
------------
¦23n3
Rene Serrano
Perlero nuevo
Perlero nuevo
 
Mensajes: 86
Registrado: 2006-11-27 12:35 @565
Ubicación: El salvador CA

Publicidad

Notapor monoswim » 2008-02-11 16:39 @735

¿Y qué separa cada columna? Porque con split puedes usar expresiones regulares, así que puedes usar casi cualquier separador.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open(FILE, "file.txt");
my @lines = <FILE>;
close(FILE);
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Con eso cada línea es un elemento del array

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach my $line (@lines){
   my @cols = split(/\t/, $line);
}
if ($cols[8] eq  '0.00'){
   print "El noveno elemento es 0.00\n";
}
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Espero que te sirva.

Saludos
MonoSwim
Perl Programming Language
Avatar de Usuario
monoswim
Perlero nuevo
Perlero nuevo
 
Mensajes: 452
Registrado: 2003-11-18 16:13 @717
Ubicación: Buenos Aires

Notapor Rene Serrano » 2008-02-11 16:57 @748

En realidad solo están separadas por tabulador, pero cuando en la columna no hay datos también pone espacios así que no sé cómo entrarle ;(

por ejemplo
Código: Seleccionar todo
  0004 4135 empleado        15        264.00    125.71      [*]        [*]         138.29    122.00     264.00     264.00      7.92      15.84       15.77       0.00       0.00      34.60      [*]       189.87


Donde [*] son espacios en blanco que en otras filas si tiene datos, creo que primero hay que unificar todo pero así me dan el archivo. ¿Qué más puedo hacer?
------------
¦23n3
Rene Serrano
Perlero nuevo
Perlero nuevo
 
Mensajes: 86
Registrado: 2006-11-27 12:35 @565
Ubicación: El salvador CA

Notapor explorer » 2008-02-11 17:41 @778

Yo creo que no son tabuladores... viendo cómo están colocados algunos números, creo que las columnas están en una determinada posición.

En ese caso este problema hay que atacarlo con un unpack.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Rene Serrano » 2008-02-11 18:47 @824

Bueno, el problema es que cuando los nombres de los empleados son largos se corre la línea, así que por posición también estaría en problemas :(

Seguiré revisando y leeré sobre unpack.

Saludos
------------
¦23n3
Rene Serrano
Perlero nuevo
Perlero nuevo
 
Mensajes: 86
Registrado: 2006-11-27 12:35 @565
Ubicación: El salvador CA

Notapor Rene Serrano » 2008-02-11 19:25 @851

Ya logré tener un fichero de un ancho fijo. Ahora solo trabajaré con lo de unpack para ver cómo me resulta.

Saludos
------------
¦23n3
Rene Serrano
Perlero nuevo
Perlero nuevo
 
Mensajes: 86
Registrado: 2006-11-27 12:35 @565
Ubicación: El salvador CA

Notapor Rene Serrano » 2008-02-12 11:01 @501

Gracias por todo, como dijo explorer unpack era la solución.
Saludos
------------
¦23n3
Rene Serrano
Perlero nuevo
Perlero nuevo
 
Mensajes: 86
Registrado: 2006-11-27 12:35 @565
Ubicación: El salvador CA

Notapor explorer » 2008-02-12 13:16 @594

:mrgreen: :mrgreen: :mrgreen: ¡Queremos verla! :mrgreen: :mrgreen: :mrgreen:
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Rene Serrano » 2008-02-12 13:33 @606

Pues la tomé de una de tus respuesta :D Espero no te moleste :D ¡¡ y la modifiqué un poquín !!
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!perl
sub lee_fichero {
    my ($fichero,$formato,$hash_ref,$clave) = @_;
    open(my $data,'<',$fichero) or die "ERROR: $!\n";

    while ( $linea = <$data> ) {
        ##obteniendo solo las lineas  necesarias
                        if ($linea =~ /^\s*(\d+)/){
                        my @campos = unpack($formato, $linea);
                        #Encontrando campos
                        if($campos[8]!="0.00")
                        {
                                $hash_ref->{ $campos[$clave] } = $linea;
                        }              
                                }      
       
    }

    close $data;
}

lee_fichero('a.txt', 'A11 A35 A8 A14 A10 A11 A11 A11 A11', \%data1,1);

# salida

foreach my $clave ( keys %data1 ) {
    print($data1{$clave});
}
 
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Saludos
------------
¦23n3
Rene Serrano
Perlero nuevo
Perlero nuevo
 
Mensajes: 86
Registrado: 2006-11-27 12:35 @565
Ubicación: El salvador CA

Notapor criter » 2008-02-13 14:16 @636

:D :D :D :D

Sorry. ¿No es lo mismo que hacer
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open(FILE, "a.txt");
my @lines = <FILE>;
close(FILE);[/b]

foreach my $line (@lines)
 {
   my @cols = split(/\t/, $line);

 }

if ($cols[8] eq  '0.00' ||$cols[8] eq  '' ){
   print "El noveno elemento es 0.00\n";
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
?
criter
Perlero nuevo
Perlero nuevo
 
Mensajes: 1
Registrado: 2008-02-13 14:12 @633


Volver a Básico

¿Quién está conectado?

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

cron