Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

¡Vuelvo a la carga!

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Vie Ago 31, 2007 1:26 pm
Merisue
Perlero Nuevo
Perlero Nuevo
Registrado: 24 Ago 2007
Mensajes: 19
¡Vuelvo a la carga! Responder citando

Hola a todos de nuevo. ¡¡Juro por Dios que en cuanto cobre en Octubre haré un donativo!! Mr. Green Tengo otro problema al cambiar un archivo... ¡sí, es increíble pero cierto! Os pongo el archivo y el programa que uso para abrirlo y cambiarlo a ver qué es esta vez... Embarassed

Código:
! Time   Wind   Wind   Vert.   Horiz.   Vert.   LinV   Gust
!         Speed   Dir   Speed   Shear      Shear   Shear   Speed
  0.0       4.0    0.0   0.0   0.0      0.2   0.0   0.0
  0.1       4.0    0.0   0.0   0.0      0.2   0.0   0.0
999.9       4.0    0.0   0.0   0.0      0.2   0.0   0.0


Este es el programa que quiero cambiar... en concreto quiero cambiar la segunda columna de números la que son todo 4, entre cada columna aunque aquí no se ve hay un tabulador y un par de espacios y el problema que me encuentro a la hora de hacer el cambio es que no solo no me cambia nada sino que me borra todo el contenido del archivo vaya que lo abre en sobreescritura, supongo, pero no imprime las líneas de nuevo...

El programa que uso para esto es el siguiente:
Perl:
# Corre todos los casos de FAST para generar la curva Cp-lambda.
# ______________________________________________________________________


# Cambio la velocidad del viento en el archivo wnd para cada valor de lambda
for $i (2..15) {

    # Lugar donde almacenaremos el fichero leido y modificado
    my @wind;

    # Defino la ley de variación de la velocidad con lambda si w= cte como vel = w*R/l
    $j = 1.885 * 38.75 / $i;

    open (WND, ">wind.wnd");

    for (<WND>) {

        $line =~ s/(\d\s+)\d+/$1$j/;

        push @wind, $line;
    }

    close WND; # Cierro el archivo de viento

    # Grabamos el resultado
    open (OVERWRITE, ">wind.wnd") or die "No se pudo abrir wind.wnd: $!";
    print OVERWRITE @wind or die "No se pudo sobreescribir wind.wnd: $!";
    close OVERWRITE;

    # Cambiamos el nombre de todos los archivos incluyendo $i
    for $k (-6..30) {
        rename ("H70($k).fst","H70($k)$i\.fst");
 
        # Corremos todos los casos
        system ("c:\fast\FAST \H70($k)$i.fst") == 0 or die "No se pudo correr el caso: $!";
    }
}

¡¡A ver si me podéis echar otro cable, por favor!! ¡¡Muchísimas gracias por la ayuda!!
Mensaje Vie Ago 31, 2007 2:52 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

Mmmm no entendí ni X. A ver, otra ves más tranquila, ¿qué es lo que quieres hacer?
Mensaje Vie Ago 31, 2007 3:01 pm
Merisue
Perlero Nuevo
Perlero Nuevo
Registrado: 24 Ago 2007
Mensajes: 19
Responder citando

Quiero abrir el archivo wind cuyo contenido es el que he puesto primero que aparece todo apelotonado... y quiero cambiar la columna de 4.00 por la variable $j del programa que es el resultado de una operación... En el archivo que quiero cambiar existen varios espacios entre las columnas aunque aquí no sale... El programa que he puesto hace más cosas he intentado poner en negrita la parte correspondiente a mi duda... el resto del programa lo que hace es cambiar el nombre de unos archivos y correrlos con el programa correspondiente en este caso FAST.
Mensaje Vie Ago 31, 2007 5:24 pm
Merisue
Perlero Nuevo
Perlero Nuevo
Registrado: 24 Ago 2007
Mensajes: 19
Responder citando

Me he dado cuenta de un error garrafal en el código en la linea for $line (<WND>)faltaba $line ¡pero sigue sin funcionar! También he cambiado la expresión regular a ver si así... pero con el mismo resultado... Aquí está con los cambios...

Perl:
# Corre todos los casos de FAST para generar la curva Cp-lambda.
# ______________________________________________________________________


# Cambio la velocidad del viento en el archivo wnd para cada valor de lambda
for $i (2..15) {

# Lugar donde almacenaremos el fichero leido y modificado
my @wind;

# Defino la ley de variación de la velocidad con lambda si w= cte como vel = w*R/l
$j = 1.885 * 38.75 / $i;

open (WND, ">wind.wnd")or die "No se podo abrir wind.wnd:$!";

for $line (<WND>) {

$line =~ s/(\d)(\s+)\d+/$1$2$j/ or die "No se pudo cambiar la velocidad:$!";

push @wind, $line;
      }
close WND; # Cierro el archivo de viento

# Grabamos el resultado
open (OVERWRITE, ">wind.wnd") or die "No se pudo abrir wind.wnd: $!";
print OVERWRITE @wind or die "No se pudo sobreescribir wind.wnd: $!";
close OVERWRITE;

# Cambiamos el nombre de todos los archivos incluyendo $i
for $k (-6..30) {
rename ("H70($k).fst","H70($k)$i\.fst");
 
# Corremos todos los casos
system ("c:\fast\FAST \H70($k)$i.fst") == 0 or die "No se pudo correr el caso: $!";
  }
}
Mensaje Vie Ago 31, 2007 6:01 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 498
Ubicación: Frente al monitor
Responder citando

Perl:
open (WND, ">wind.wnd")or die "No se podo abrir wind.wnd:$!";
open OVER "+>archivo.salida" or die "Arghhh! archivo.salida: $!\n";

while (my $line = <WND>) {
  if ( $line =~ /(\d)(\s+)\d+/ ){
    print OVER "$1$j\n"; #No se si deba de usar \n
  }
}

close OVER;
close WND; # Cierro el archivo de viento

Creo que sería mejor así.
Mensaje Vie Ago 31, 2007 6:21 pm
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1390
Ubicación: México
Responder citando

Si la columna que quieres cambiar siempre es 4.0 como dices, entonces lo puedes lograr de esta manera:

Perl:
open my $FILE, '<', 'wind.wnd.txt' or die("No se pudo abrir archivo: $!");
my @lines = <$FILE>;
close $FILE;

my $i = 2;

open my $OUT, '>', 'wind_out.wnd' or die("No se pudo abrir archivo: $!");

for my $line(@lines){

    chomp $line;

    if($line !~ /^!/){

        my $j = 1.885 * 38.75 / $i++;

        $line =~ s/4\.0/$j/;

    }

    print {$OUT} $line, "\n";

}

close $OUT;


Ejecutando el archivo como lo diste:

Código:
! Time   Wind   Wind   Vert.   Horiz.   Vert.   LinV   Gust
!         Speed   Dir   Speed   Shear      Shear   Shear   Speed
  0.0       4.0    0.0   0.0   0.0      0.2   0.0   0.0
  0.1       4.0    0.0   0.0   0.0      0.2   0.0   0.0
999.9       4.0    0.0   0.0   0.0      0.2   0.0   0.0


El resultado es:

Código:
! Time   Wind   Wind   Vert.   Horiz.   Vert.   LinV   Gust
!         Speed   Dir   Speed   Shear      Shear   Shear   Speed
  0.0       36.521875    0.0   0.0   0.0      0.2   0.0   0.0
  0.1       24.3479166666667    0.0   0.0   0.0      0.2   0.0   0.0
999.9       18.2609375    0.0   0.0   0.0      0.2   0.0   0.0



Saludos
Mensaje Vie Ago 31, 2007 7:02 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4222
Ubicación: Valladolid, España
Re: Vuelvo a la carga! Responder citando

Merisue escribió:

Perl:

        # Corremos todos los casos
        system ("c:\fast\FAST \H70($k)$i.fst") == 0 or die "No se pudo correr el caso: $!";

Hummm... cuidado con las '\' dentro de comillas dobles... hay que 'doblarlas':

Perl:
       system ("c:\\fast\\FAST \\H70($k)$i.fst") == 0

O separar lo fijo de lo variable:
Perl:
       system ('c:\fast\FAST \', "H70($k)$i.fst") == 0
Mensaje Sab Sep 01, 2007 4:55 am
Merisue
Perlero Nuevo
Perlero Nuevo
Registrado: 24 Ago 2007
Mensajes: 19
Responder citando

Antes de nada. ¡muchísimas gracias a todos por vuestra ayuda!

Seguro que es un error por despiste pero lo he revisado 40 veces y no lo encuentro... He probado la solución que me propone creating021 y no me funciona tampoco: deja vacíos ambos ficheros: el wind y el de salida... Por otra parte la solución de Kidd no la he probado porque la columna que quiero cambiar no será siempre 4, sólo la primera vez ya que lo que quiero es cambiar todos los 4s primero por el 36.52 que le sale a el cuando $i=2 correr todos los casos de FAST, volver a cambiar el archivo wind esta vez la columna de 36... por 24.34 y así sucesivamente... para $i de 2 a 15... No sé si me explico bien...

¡¡Ups he encontrado el gran error el signo para abrir en lectura era para abrir en escritura!! Aun así la expresión regular debe ser lo que está mal porque ahora me salta el or die de la línea de cambio de velocidad.
Mensaje Sab Sep 01, 2007 5:44 am
Merisue
Perlero Nuevo
Perlero Nuevo
Registrado: 24 Ago 2007
Mensajes: 19
Responder citando

Creo que ya he solucionado el problema, ¡¡muchísimas gracias a todos por vuestra ayuda!! El programa con los nuevos cambios queda así:

Perl:
# Corre todos los casos de FAST para generar la curva Cp-lambda.
# ______________________________________________________________________


# Cambio la velocidad del viento en el archivo wnd para cada valor de lambda
for $i (2..15) {

# Lugar donde almacenaremos el fichero leido y modificado
my @wind;

# Defino la ley de variación de la velocidad con lambda si w= cte como vel = w*R/l
$j = 1.885 * 38.75 / $i;

open (WND, "<wind.wnd")or die "No se podo abrir wind.wnd:$!";

for $line (<WND>) {

$line =~ s/(\d)(\s+)[\d+\.\d+]/$1$2$j/;

push @wind, $line;
      }
close WND; # Cierro el archivo de viento

# Grabamos el resultado
open (OVERWRITE, ">wind.wnd") or die "No se pudo abrir wind.wnd: $!";
print OVERWRITE @wind or die "No se pudo sobreescribir wind.wnd: $!";
close OVERWRITE;

# Cambiamos el nombre de todos los archivos incluyendo $i
for $k (-6..30) {
rename ("H70($k).fst","H70($k)$i\.fst")or die "No se pudo cambiar el nombre a H70($k).fst: $!";
 
# Corremos todos los casos
system ("c:\\fast\\FAST H70($k)$i.fst") == 0 or die "No se pudo correr el caso: $!";
  }
}


No creo que le sirva a nadie más ¡¡pero por si acaso lo pongo!! ¡Un saludo a todos!
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group