• Publicidad

¡Vuelvo a la carga!

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

¡Vuelvo a la carga!

Notapor Merisue » 2007-08-31 14:26 @643

Hola a todos de nuevo. ¡¡Juro por Dios que en cuanto cobre en Octubre haré un donativo!! :mrgreen: 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... :oops:

Código: Seleccionar todo
! 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:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
# 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: $!";
    }
}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

¡¡A ver si me podéis echar otro cable, por favor!! ¡¡Muchísimas gracias por la ayuda!!
Merisue
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2007-08-24 20:13 @884

Publicidad

Notapor Kiloko » 2007-08-31 15:52 @702

Mmmm no entendí ni X. A ver, otra ves más tranquila, ¿qué es lo que quieres hacer?
Nunca interrumpas a tu enemigo cuando está cometiendo un error
Napoleón Bonaparte
Avatar de Usuario
Kiloko
Perlero nuevo
Perlero nuevo
 
Mensajes: 243
Registrado: 2007-07-10 18:26 @810
Ubicación: MOnterrey NL

Notapor Merisue » 2007-08-31 16:01 @709

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.
Merisue
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2007-08-24 20:13 @884

Notapor Merisue » 2007-08-31 18:24 @808

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...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
# 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: $!";
  }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Merisue
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2007-08-24 20:13 @884

Notapor creating021 » 2007-08-31 19:01 @834

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
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
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Creo que sería mejor así.
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

Notapor kidd » 2007-08-31 19:21 @848

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

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
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;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ejecutando el archivo como lo diste:

Código: Seleccionar todo
! 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: Seleccionar todo
! 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
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Re: Vuelvo a la carga!

Notapor explorer » 2007-08-31 20:02 @876

Merisue escribiste:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
        # Corremos todos los casos
        system ("c:\fast\FAST \H70($k)$i.fst") == 0 or die "No se pudo correr el caso: $!";
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

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

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
       system ("c:\\fast\\FAST \\H70($k)$i.fst") == 0
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

O separar lo fijo de lo variable:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
       system ('c:\fast\FAST \', "H70($k)$i.fst") == 0
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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

Notapor Merisue » 2007-09-01 05:55 @288

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.
Merisue
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2007-08-24 20:13 @884

Notapor Merisue » 2007-09-01 06:44 @322

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

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
# 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: $!";
  }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


No creo que le sirva a nadie más ¡¡pero por si acaso lo pongo!! ¡Un saludo a todos!
Merisue
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2007-08-24 20:13 @884


Volver a Básico

¿Quién está conectado?

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