Perl - Conversión de todos los archivos con extensión. (dentro o no de un directorio..)

 
Vista:

Conversión de todos los archivos con extensión. (dentro o no de un directorio..)

Publicado por Autodolor (4 intervenciones) el 17/09/2018 12:16:15
Buenas sean.
Tengo un rompecabezas (para mí, ya que no soy ducho en perl..)
Tengo un script -no es mío, sino de un libro de VRML de hace unos 25 años...,que, digamos, reduce valores de precisión doble a simple. No sé si parece "correcto", pero en mi caso sí es muy importante, ya que trabajo con secuencias de formato 3D tipo Wavefront .obj.
Este formato crea "posiciones" en XYZ con excesivos decimales, y éste script, los reduce a dos, con la consabida ganancia de "menor peso" en Kb o Mb.. sin afectar a la topología del modelo.
Funciona estupendamente en cualquier tipo de formato con números en UTF8 o ANSI, pero, tengo que pasar este script por unos 300/900/2000 archivos .obj, o de extensión .X. Es lo mismo. Lo que quiero es si me podeis ayudar en que esto se aplique a todos los archivos dentro de un directorio
El script es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
for ($x=-1; $x++ < $#ARGV; ) {
	$file = $ARGV[$x];
	if (! (-e $file) )  {
		print "$file not found, skipping...\n";
		next;
	}
    &convert($file);
}
exit;
 
sub convert {
    local ($file)= @_;
    open  (OLD, $file) || die "Couldn´t open $file: $!\n";
    open  (NEW, ">$file.new") || die "Couldn´t open $file.new: $!\n";
    while (<OLD>) {
        $line = $_;
        if (/Normal/) { while (<OLD>) { last if /}/; } Sline => ""; }
    if (/normalIndex/) { while(<OLD>) { last if /[]]/; } $line = ""; }
        $line  =~  s/[-+]?[0-9]\.[0-9]+e[+-][0-9]+/0/g;
        $line  =~  s/([-+]?[0-9]+\.[0-9]{2})[0-9]+/$1/g;
        $line =~ s/0\.00/0/g;
        $line =~ s/[ ]+/ /g;
        $line =~ s/[\t]+/ /g;
        $line =~ s/^ //g;
        print NEW $line;
}
close OLD;
close NEW;

---------------------
Creo que el principal problema viene con asignar un fichero en su uso, que sería, (uso windows 10 con Strawberry perl..) en línea de comandos : archivo.pl xxxx.obj.
Creo, por lo visto, que si uso (usó el programador original...) de ARGV, se identifica el nombre. Sin embargo, lo deseable sería todos los archivos con extensión tipo .obj, o de .txt con datos "superfluos...". En este caso, la extensión es lo de menos.
Si hago un script tipo ---------> for i in folder/* ; do perl NOMBRE.pl <$i; done , digamos una llamada al script para todos, no funciona por el condicionante de nombre de ARGV...
No sé si me explico bien, dados mis escasos conocimientos de Perl...
Sólo es cambiar "un nombre específico de archivo" por todos los de ".extensión", y no sé resolver esto. Y, en este caso lo que genera es un archivo "xxx.obj.new". Es claro que renombrar todo ese tamaño de archivos, también es un poco cansino. Tal vez, crear un "new_xx.obj" y evitar esa tediosa faena.. (ya, por pedir..) :D
Gracias por vuestra ayuda de antemano, y disculpad si no se cómo poner en sintaxis el script..
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Conversión de todos los archivos con extensión. (dentro o no de un directorio..)

Publicado por Autodolor (4 intervenciones) el 17/09/2018 12:36:38
perdón... hay un error en un Sline que debe ser $line. en línea 17..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
for ($x=-1; $x++ < $#ARGV; ) { 
	$file = $ARGV[$x];
	if (! (-e $file) )  {
		print "$file not found, skipping...\n";
		next;
	}
    &convert($file);
}
exit;
 
sub convert {
    local ($file)= @_;
    open  (OLD, $file) || die "Couldn´t open $file: $!\n";
    open  (NEW, ">$file.new") || die "Couldn´t open $file.new: $!\n";
    while (<OLD>) {
        $line = $_;
        if (/Normal/) { while (<OLD>) { last if /}/; } $line => ""; }
    if (/normalIndex/) { while(<OLD>) { last if /[]]/; } $line = ""; }
    $line  =~  s/[-+]?[0-9]\.[0-9]+e[+-][0-9]+/0/g;
    $line  =~  s/([-+]?[0-9]+\.[0-9]{2})[0-9]+/$1/g;
    $line =~ s/0\.00/0/g;
    $line =~ s/[ ]+/ /g;
    $line =~ s/[\t]+/ /g;
    $line =~ s/^ //g;
    print NEW $line;
}
close OLD;
close NEW;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Conversión de todos los archivos con extensión. (dentro o no de un directorio..)

Publicado por a (4 intervenciones) el 17/09/2018 12:51:03
Creo que ya lo tengo...
Con esta modificación, pasando de ARGV, y usando foreach con @files...
Sin mayores argumentos, tal cual en la shell xxx.pl (sin nada más..), ejecutado en el directorio, sí lo cumple.. El problema, es el "xxxx.obj.new", que eso sí que no sé como pasarlo a "new_xxx.obj"


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@files = <*.obj>;
foreach $file (@files) {
    open  (OLD, $file) || die "Couldn´t open $file: $!\n";
    open  (NEW, ">$file.new") || die "Couldn´t open $file.new: $!\n";
        while (<OLD>) {
            $line = $_;
            if (/Normal/) { while (<OLD>) { last if /}/; } Sline => ""; }
        if (/normalIndex/) { while(<OLD>) { last if /[]]/; } $line = ""; }
        $line  =~  s/[-+]?[0-9]\.[0-9]+e[+-][0-9]+/0/g;
        $line  =~  s/([-+]?[0-9]+\.[0-9]{2})[0-9]+/$1/g;
        $line =~ s/0\.00/0/g;
        $line =~ s/[ ]+/ /g;
        $line =~ s/[\t]+/ /g;
        $line =~ s/^ //g;
        print NEW $line;
    }
    close OLD;
    close NEW;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Conversión de todos los archivos con extensión. (dentro o no de un directorio..)

Publicado por Autodolor (4 intervenciones) el 17/09/2018 13:14:38
Vale! Estaba espeso hoy y tontaina!
Con cambiar new por obj, se crea el xxx.obj.obj, que sí me sirve!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar