• Publicidad

Eliminar y guardar una fila

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

Eliminar y guardar una fila

Notapor lis » 2009-08-05 14:56 @664

Hola amigos del foro: tengo archivos $altura.txt que tiene lo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
20080119   1000    0.0  24.80  21.19
20080120   1000    0.0  25.23  20.95
20080121   1000    0.0  24.76  21.31
20080122   1000    0.0  24.85  20.83
20080123   1000    0.0  24.69  19.92
20080124   1000    0.0  24.23  20.79
20080125   1000   20.2  23.46  21.18
20080126   1000   20.0  23.55  20.90
20080127   1000   16.4  24.02  19.97
20080128   1000   19.4  23.35  19.03
20080130   1000   18.4  23.04  19.54
20080131   1000   18.4  22.66  19.38
20080201   1000   17.8  22.35  20.12
20080203   1000   17.8  22.81  19.94
20080204   1000   18.8  23.44  19.82
20080205   1000   18.2  23.79  19.57
20080206   1000   18.0  23.77  18.75
20080207   1000   16.4  23.71  19.67
20080208   1000   16.8  23.97  19.65
20080209   1000    0.0  23.24  20.19
20080212   1000    0.0  24.87  20.55
20080214   1000   16.6  24.55  20.77
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


En la tercera columna a veces salen el numero 0.0, y es aquí donde necesito su ayuda, cada vez que en columna 3 salga 0.0 la fila completa se elimine y se guarde en un nuevo archivo, e hice el siguiente script en donde no hace nada.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3.  
  4. for my $fichero (</home/visita/Desktop/DATOS/2008_resultados_sge/2008/tmp/*.txt>) {
  5.     #my $fecha = substr $fichero, 0, 8;
  6.  
  7. for my $altura ( 1000, 925, 850, 700, 500, 400, 300, 250, 200, 150, 100 ){
  8.  
  9. $archivo=$altura . '.txt' ;
  10.  
  11. print "Procesando fichero del día $archivo...\n";
  12.  
  13.     my $fichero  = $altura . '.txt';
  14.     my $fichero_salida = $altura . '_.txt';
  15.  
  16.  
  17. open (DATOS, "<$fichero");
  18. open (ARCHIVOS, ">$fichero_salida");
  19.  
  20. while($linea = <DATOS>){
  21.     chop($linea);
  22.     @datos = split(" ", $linea);
  23.  
  24.         if ($datos[2] =~ 0.0) {
  25. system "(mv @datos $fichero_salida)";}
  26.  
  27.     #print ARCHIVOS "@datos\n";
  28. }
  29. }}
  30. close (ARCHIVOS);
  31. close (DATOS);
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


De antemano les agradezco su ayuda, y muchas gracias a todos.
Última edición por lis el 2009-08-06 16:01 @709, editado 1 vez en total
lis
Perlero nuevo
Perlero nuevo
 
Mensajes: 106
Registrado: 2008-05-27 21:43 @946

Publicidad

Re: Eliminar y guardar una fila

Notapor creating021 » 2009-08-05 18:58 @832

Hola lis, recuerda que debes de usar los tags del coloreado de sintaxis.

Ahora, vamos por el código.
Lo primero, esencial en todo programa hecho en Perl es usar, al menos, el pragma strict a la hora de desarrollar, así que las primeras líneas deberían ser las siguientes:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Eso no ayudará a cometer menos errores (nos dice cuales son) y de verdad que estás cometiendo muchos :lol: .

Hay algo que no entiendo del código... primero haces un bucle para todos los archivos texto que hay en un directorio, pero nunca usas esos nombres.

Para buscar algo en un archivo y copiar ciertos datos a otro se hace así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3.  
  4. my @ficheros = ("f_1.txt", "f_2.txt");
  5. my $salida   = "salida.txt";
  6.  
  7. foreach my $fichero ( @ficheros ) {
  8.     open ENTRADA, $fichero or die "Error con $fichero: $!\n";
  9.     open SALIDA, ">>$salida" or die "Error con $salida: $!\n";
  10.     while ( my $linea = <ENTRADA> ) {
  11.         chomp $linea;
  12.         if ( $linea =~ /^\d+\s+0.0\s+*$/ ) {
  13.             print SALIDA "$linea\n";
  14.         }
  15.     }
  16.     close SALIDA;
  17.     close ENTRADA;
  18. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

PD: No he probado el código :roll:
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Re: Eliminar y guardar una fila

Notapor lis » 2009-08-06 18:30 @813

Muchas gracias por tu ayuda creating021, tu script me ayudó a identificar las filas que contienen "0.0" y guardarlas en un nuevo archivo. Pero necesito que me ayudes en otra cosa: si esas mismas líneas que identifico las borré del archivo original o si en un nuevo archivo se guarden todas las columnas que no contienen "0.0". Te agradecería un montón.
Última edición por explorer el 2009-08-07 12:38 @568, editado 1 vez en total
Razón: Ortografía
lis
Perlero nuevo
Perlero nuevo
 
Mensajes: 106
Registrado: 2008-05-27 21:43 @946

Re: Eliminar y guardar una fila

Notapor creating021 » 2009-08-06 22:07 @963

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ( $linea !~ /^\d+\s+0.0\s+*$/ ) {
  2.     print SALIDA "$linea\n";
  3. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Las expresiones regulares son una herramienta muy útil, al menos aprende lo básico de éstas.
Aquí tienes una tutoría básica de expresiones regulares que explica el código que he puesto :)
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Re: Eliminar y guardar una fila

Notapor explorer » 2009-08-07 13:48 @617

Otra solución, un poco más sencilla:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
perl -ane 'print if $F[2] ne "0.0"' altura.txt > altura_sin_ceros.txt
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Aquí, es ejecutada en la misma línea de comandos, pero es fácil de llevar a un programa.

¿Alguien se atreve?
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: Eliminar y guardar una fila

Notapor netsoul » 2009-08-08 04:10 @215

Como Perl tiene miles de formas de hacer, aquí va otro más:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
perl -pe 's/.* 0\.0.*\n$//' altura.txt > altura_sin_ceros.txt
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

:D
With Perl
Imagination is more important than knowledge. Albert Einstein.
netsoul
Perlero nuevo
Perlero nuevo
 
Mensajes: 150
Registrado: 2008-05-04 01:11 @091

Re: Eliminar y guardar una fila

Notapor explorer » 2009-08-08 21:34 @940

Esa solución no vale, netsoul: puede fallar si aparece un '0.0' en cualquier columna.

:wink:
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: Eliminar y guardar una fila

Notapor netsoul » 2009-08-09 01:11 @091

Jeje... Ya sabía que no ibas a tardar en responder. A ver...
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
perl -pe 's/\d+\s+\d+\s+0\.0.*\n$//' altura.txt > altura_sin_ceros.txt
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
With Perl
Imagination is more important than knowledge. Albert Einstein.
netsoul
Perlero nuevo
Perlero nuevo
 
Mensajes: 150
Registrado: 2008-05-04 01:11 @091


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 15 invitados

cron