• Publicidad

Modificar archivos dependiendo de lo que contenga

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Modificar archivos dependiendo de lo que contenga

Notapor jnunezf » 2008-04-04 00:24 @058

Hola, soy nuevo en el foro. Tengo un problema a resolver, lo que quiero es agregar al final de un archivo "un texto" que dependa de lo que "contenga cada archivo" del directorio; por ejemplo:

Si el archivo contiene este texto: (comb. lineal con variables)
Código: Seleccionar todo
7.21*x101 + 5.66*x102;

tenga que agregar al final este texto: (declaración de las variables)
Código: Seleccionar todo
bin x101, x102;


En cambio, si contiene este texto, (más grande)
Código: Seleccionar todo
7.21*x101 + 5.66*x102 + 5.83*x103 + 6.32*x104 ;

se tenga que agregar este texto:
Código: Seleccionar todo
bin x101, x102, x103, x104;


Lo que quiero es que, para cada archivo, encuentre todas las variables x y las declare al final del archivo como 'bin'.

Por favor, confío en ustedes, espero que no sea tan complicado.

Muchas Gracias.
jnunezf
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2008-04-04 00:10 @048

Publicidad

Notapor explorer » 2008-04-04 06:53 @328

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

¿Dónde está el código de prueba? Es que dar la solución, sin más ni más... (además, estamos en el foro Intermedio).

¿Una variable, por ejemplo la x101, puede aparecer más de una vez en el texto? ¿Puede aparecer más de una vez la línea con la ecuación? ¿Debe guardarse en el fichero de salida las variables encontradas en algún determinado orden? ...
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 jnunezf » 2008-04-04 10:43 @488

Hola, gracias por la acotación.
La idea es agregar información al final de un archivo que contiene un modelo de programación lineal.
Una vez que lea función objetivo, por ejemplo:
Código: Seleccionar todo
min:
   7.21*x101 + 5.66*x102 + 5.83*x103 + 6.32*x104 +
   7.07*x105 + 3.61*x106 + 5*x107 + 7.21*x110;

todas estas variables aparecen una sola vez antes del ";" y necesito declararlas al final como:
Código: Seleccionar todo
bin x101, x102, x103, x104, x105, x106, x107, x110;

no importa el orden, pero la idea es que aparezcan todas.
Otra cosa importante es que después del ";" en el archivo sigue una lista de restricciones donde se repiten estas variables, como por ejemplo:
Código: Seleccionar todo
subjecttor11:
   x101 + x102 + x103 = 1;

subjecttor12:
   x201 + x202 + x203 = 1;

Estas líneas no hay que considerarlas. Hay que considerar todo el texto que está antes del primer ";" del archivo.
Aquí les pongo un archivo de ejemplo que tengo:
Código: Seleccionar todo
min:
   7.21*x101 + 5.66*x102 + 5.83*x103 + 6.32*x104 +
   7.07*x105 + 3.61*x106 + 5*x107 + 7.21*x110 +
   8.25*x112 + 11.05*x113 + 8.25*x114 + 14.21*x115 +
   10.82*x116 + 4.12*x117 + 5.66*x120 + 8.25*x121 +
   11.4*x123 + 11.66*x124 + 9.06*x125 + 7.28*x126 +
   4.12*x127 + 5.83*x130 + 11.05*x131 + 11.4*x132 +
   4.24*x134 + 8*x135 + 5.39*x136 + 10.44*x137 +
   6.32*x140 + 8.25*x141 + 11.66*x142 + 4.24*x143 +
   11.4*x145 + 8.06*x146 + 9.22*x147 + 7.07*x150;


subjecttor11:
   x101 + x102 + x103 = 1;

subjecttor12:
   x201 + x202 + x203 = 1;


subjecttor311:
   x110 + x111 + x112 + x113 + x114 + x115 +
   x116 + x117 - x140 - x141 - x142 - x143 -
   x144 - x145 - x146 - x147 = 0;

Aunque las variables se repiten en el archivo, las tengo que declarar al final sin que se repitan. En la función objetivo no se repiten.
No tengo que crear otro archivo, sólo modificar el original declarando las variables.

Espero que no sea tan complicado. :D
Gracias
jnunezf
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2008-04-04 00:10 @048

Notapor explorer » 2008-04-04 12:46 @574

A ver si con lo siguiente tienes una pista:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
perl -p -e 'BEGIN {$in=0} $in=1 if /^min:/; if ($in==1) { while( /(x\d+)/g ) {$vars{$1}++} }  $in=2 if /;/;  END { print "\nbin ",join(", ",sort keys %vars),";\n" }' kk.txt
Coloreado en 0.003 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: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2008-04-05 18:17 @803

Aquí tienes dos soluciones:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use warnings;
use strict;

my %vars;

my $archivo = shift @ARGV or die;
open F, "<$archivo"       or die;
while ( <F> ) {
    if ( /^min:/ .. /^$/ ) {
        while ( /(x\d+)/g ) {
            $vars{$1} = 1;
        }
    }
    print ;
}
close F;

print "\nbin ";
print join ', ', sort keys %vars;
print ";\n";

__END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use warnings;
use strict;

my $archivo
    = do {
        local $/;
        open F,$ARGV[0];
        <F>;
    };

my ($min) = $archivo =~ /min:(.*?);/simo;

my %hash;
map { $hash{$_}++ } $min =~ /(x\d+)/g;

print "$archivo\nbin ", join(", ",sort keys %hash),";\n";

__END__
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: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Intermedio

¿Quién está conectado?

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

cron