Vie Ago 31, 2007 1:26 pm
|
 |
Merisue
Perlero Nuevo

|
Registrado: 24 Ago 2007
Mensajes: 19
|
|
| ¡Vuelvo a la carga! |
|
|
Hola a todos de nuevo. ¡¡Juro por Dios que en cuanto cobre en Octubre haré un donativo!! 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...
| 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!! |
|
|
|

Vie Ago 31, 2007 2:52 pm
|
 |
Kiloko
Perlero Adicto

|
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
|
|
|
|
|
| Mmmm no entendí ni X. A ver, otra ves más tranquila, ¿qué es lo que quieres hacer? |
|
Vie Ago 31, 2007 3:01 pm
|
 |
Merisue
Perlero Nuevo

|
Registrado: 24 Ago 2007
Mensajes: 19
|
|
|
|
|
| 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. |
|

Vie Ago 31, 2007 5:24 pm
|
 |
Merisue
Perlero Nuevo

|
Registrado: 24 Ago 2007
Mensajes: 19
|
|
|
|
|
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: $!";
}
} |
|
|

Vie Ago 31, 2007 6:01 pm
|
 |
creating021
Vive para Perl en Español

|
Registrado: 23 Feb 2006
Mensajes: 498
Ubicación: Frente al monitor
|
|
|
|
|
| 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í. |
|

Vie Ago 31, 2007 6:21 pm
|
 |
kidd
Creador de Perl en Español

|
Registrado: 15 Oct 2003
Mensajes: 1390
Ubicación: México
|
|
|
|
|
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 |
|

Vie Ago 31, 2007 7:02 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4222
Ubicación: Valladolid, España
|
|
| Re: Vuelvo a la carga! |
|
|
| 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 |
|
|

Sab Sep 01, 2007 4:55 am
|
 |
Merisue
Perlero Nuevo

|
Registrado: 24 Ago 2007
Mensajes: 19
|
|
|
|
|
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. |
|

Sab Sep 01, 2007 5:44 am
|
 |
Merisue
Perlero Nuevo

|
Registrado: 24 Ago 2007
Mensajes: 19
|
|
|
|
|
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! |
|

Powered by phpBB © 2001, 2005 phpBB Group
|