#!/usr/bin/perl -w

use 5.034;

$|=1;

my $DEBUG = 0;

my ($opts, $filename); 
for (@ARGV){
    if (-e $_){
        $filename = $_;
        last;
    }else{
        $opts .= $_;
    }
}

my (@d, $M, $N);
my @flag; 
my @max = (-9e99) x 10000;
if (-e $filename){
    open IN, '<', $filename or die $!;
    while (<IN>){
	next if (/^#/);  # no comments will be processed
        chomp;
	my @line = split /\s+|\,/, $_;
        $M++;
        $N = 0;
        for (@line) {
            $N++;
	    if ($_ eq 0+$_){
		$d[$M][$N]= $_; # fila, columna para no perderse
		if ($_ >= $max[$N]) {
		    $max[$N] = $_;
		}
	    }else{
		$d[$M][$N]= "NaN";
		$flag[$N]++;
	    }
        }
    }  
    close IN;
    for (1..$N){
	unless (defined $flag[$_]){ $flag[$_]=0; }
    }
}else{
    die "Usage: $0 <filename>";
}
say "El número de líneas es $M";
print "Introduzca el máximo entero al que convertir todas las columnas [pista: grande]: ";
chomp ( my $wow = <STDIN> );

for my $i (1..$M) {
    for my $j (1..$N) {
	next unless ($flag[$j] == 0);
	$d[$i][$j] = int ( 0.5 + $wow * $d[$i][$j] /$max[$j] );
    }
}

open OUT, ">", $filename.".int" or die $!;
for my $i (1..$M){ # row
    for my $j (1..$N){   # col
	print OUT "$d[$i][$j]";
	if ($j < $N) { 
	    print OUT ","; 
	}else{
	    say OUT "";
	}
    }
}
close OUT;
say "Done! 🚬";

exit 3;

__END__
  
Esta utilidad puede valer para comprimir float grandes (16 dígitos)
  a algo similar con enteros. Cuanto más grande sea $wow, mejor
  es la simplificación. Pero 0j0, que no hay comida gratis. 
  
