• Publicidad

Tratamiento de un fichero de texto

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

Tratamiento de un fichero de texto

Notapor josef berlin » 2009-01-02 06:02 @293

Hola a todos.

Estoy aprendiendo Perl, y he escrito un pequeño programa que no acaba de funcionar del todo. El fichero de entrada simple.tr muestra los diferentes eventos de una simulación. Debido a que ocurren muchos en momentos muy puntuales, quiero seleccionar eventos para hacer una gráfica, que sea entendible. Así que lo que hay que hacer es a través de una variable llamada paso, ir incrementando el tiempo y seleccionando eventos.

A continuación os enseño un par de líneas del fichero de entrada, y el código que he escrito.

Espero vuestra ayuda y comentarios.
Muchas gracias.

José

Fichero de entrada:
Código: Seleccionar todo
D 76.430622539 _0_ RTR  CBK 11 tcp 80 [0 0 0 800] ------- [0:0 1:0 32 1] [0 0] 0 0
s 81.503053035 _1_ RTR  --- 17 message 32 [0 0 0 0] ------- [1:255 -1:255 32 0]
r 81.503945197 _0_ RTR  --- 17 message 32 [0 ffffffff 1 800] ------- [1:255 -1:255 32 0]


Código
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$file1 = "simple.tr";
$file2 = "mull.txt";
$file3 = "salida.txt";
open(DATEI, "< $file1") || die "Fehler beim lesen der $file1.";
open(DATEI2,"> $file2") || die "Fehler beim lesen der $file2.";
open (DATEI3,"> $file3") || die "Fehler beim lesen der $file3.";
$paso = 0.1;
$inicio= 0;
while(<DATEI>)
{
  chomp;
  @line = split (' ',$_);
  if ($inicio== 0){
  $time = $line[1];
  $inicio = 1;
  }
if ($line[0] eq "r" && $line[3] eq "MAC" && $line[2] eq "_1_")
 {
        if ($time - $line[1] < 0.0001)
        {
        print DATEI3  "$line[1] $line[2] $line[7]\n";
        $time = $time + $paso;
        }
        else
        {
        print DATEI2 "@line\n";
        }
}
}      

close (DATEI) || die "Fehler beim Schliessen: $file1";
close (DATEI2) || die "Fehler beim Schliessen: $file2";
close (DATEI3) || die "Fehler beim Schliessen: $file3";
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
josef berlin
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2008-12-30 20:05 @878

Publicidad

Notapor explorer » 2009-01-02 09:09 @423

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

Yo el problema que le veo son los '&&'. No me gustan ahí tan sueltos... mejor usar 'and', que tiene menor precedencia. O usar paréntesis, para estar seguros.

En cuanto a la lógica del programa, no me queda claro qué es lo que quieres hacer. Es decir, ¿qué valores quieres extraer y en qué orden? ¿Están los datos desordenados cronológicamente?
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 josef berlin » 2009-01-02 09:30 @438

¡¡Gracias por tu rápida respuesta!!

En principio quiero solo hacer una gráfica del throughput de una simulación.

Debido a que cada módulo de la simulación consta de diferentes submódulos, que se van pasando el mensaje de capa en capa, se generan un mónton de eventos, que para mi gráfica del throughput son totalmente superficiales. Así, quiero generar un archivo de texto en el que solo aparezca un evento que yo busco (en la primera sentencia if) en incrementos de tiempo de 0.1 segundos, con el nodo que sufre el evento y la capacidad en bits del paquete que recibe.

Espero que te haya podido aclarar algo.

Muchos saludos.
Josef

P.D.- Aunque vivo fuera de España desde hace tiempo, soy de Valladolid yo también. ¡¡Así que especiales saludos a mi paisano!!
josef berlin
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2008-12-30 20:05 @878

Notapor explorer » 2009-01-02 20:08 @880

Esta es mi versión:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

my $fichero_entrada = 'kk.txt';
my $fichero_salida  = 'salida.txt';
my $fichero_todo    = 'mull.txt';

open FICHERO_ENTRADA, "<$fichero_entrada" or die "ERROR al abrir $fichero_entrada\n";
open FICHERO_SALIDA,  ">$fichero_salida"  or die "ERROR al abrir $fichero_salida\n";
open FICHERO_TODO,    ">$fichero_todo"    or die "ERROR al abrir $fichero_todo\n";

my $paso   = 0.1; # Lapso entre ticks
my $tiempo = 0.0; # Tiempo inicial. Si es cero, se inicializa al primer valor del fichero

while (my $linea = <FICHERO_ENTRADA>) {

    my ($letra, $lapso, $numero, $tipo, undef, undef, undef, $puerto) = split " ", $linea;

    next if $letra ne 'r' or $numero ne '_1_' or $tipo ne 'MAC';  # Filtrado

    $tiempo = $lapso if not $tiempo;

    if ($lapso > $tiempo ) {

        $tiempo += $paso;

        print FICHERO_SALIDA "$lapso $numero $puerto\n";
    }

    print FICHERO_TODO $linea;
}

close FICHERO_TODO;
close FICHERO_SALIDA;
close FICHERO_ENTRADA;

__END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Algunos comentarios.
* La línea de asignación de $tiempo cuando está vacío se podría quitar si sabemos que todos los tiempos empiezan en cero
* Se utilizan un next para saltar a la siguiente línea en caso de no ser una que nos interese.

Humm... creo que ha quedado casi igual que el tuyo. No hay mucha mejora.

Saludos desde el nebuloso Valladolid.
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 josef berlin » 2009-01-05 06:25 @309

Gracias, todo entendido, probado y comprobado.
Salu2.
Jose
josef berlin
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2008-12-30 20:05 @878


Volver a Básico

¿Quién está conectado?

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

cron