#!/usr/bin/perl -w # # Generador aleatorio de archivos de llamadas # # Leandro Lucarella - dom oct 17 18:37:05 ART 2004 # # Bajo licencia GPL. # # Uso: # ./callgen [cant_archivos [min_lineas [max_lineas]]] # # cant_archivos Cantidad de archivos a generar. # min_lines Mínima cantidad de líneas que puede tener un archivo. # max_lines Máxima cantidad de líneas que puede tener un archivo. # # Por la entrada estándar debe recibir los códigos de países para origen y/o # destino. Toma los dos primeros caracteres por línea como un código, ignorando # el resto, de manera que se puede hacer: # cat oridesti.txt | ./gencall # Configuración $CANT_ARCHS=10; $MIN_LINEAS=1000; $MAX_LINEAS=5000; #{{{ Variables globales our @codes; # Códigos de origen/destino #}}} #{{{ Funciones #{{{ load_codes() - Obtiene códigos de origen/destino de la entrada estándar # Uso: load_codes() sub load_codes() { while (<>) { ; push(@codes, substr($_, 0, 2)); } } #}}} #{{{ get_rnd_code() - Obtiene un códigos de origen/destino al azar # Uso: get_rnd_code() sub get_rnd_code() { my $cant = @codes; return $codes[rnd($cant-1)]; } #}}} #{{{ rnd() - Genera números aleatorios # Uso: rnd(MAX) - genera número de 0 a MAX (inclusive) # rnd(MIN, MAX) - genera número de MIN a MAX (inclusive) # # Nota: respeta el tamaño del campo más chico, es decir, si se usa rnd 01 250, # el número siempre tendrá al menos 2 dígitos rellenados con ceros, como # 04, 28, 123, 08, etc sub rnd($;$) { my ($ini, $fin) = @_; if (!$fin) { $fin = $ini; $ini = 0; } return sprintf('%0'.length($ini).'d', $ini + rand() * ($fin - $ini + 1)); } #}}} #{{{ Tipos de campos sub aaaa() { return rnd(1999, 2004); } # año sub mm() { return rnd("01", 12); } # mes sub dd() { return rnd("01", 28); } # día sub hh() { return rnd("00", 23); } # hora sub MM() { return rnd("00", 59); } # minutos sub DDDD() { return rnd("0000", 9999); } # código de central telefónica sub char() { return chr(rnd(65, 90)); } # caracter aleatorio #}}} #{{{ line() - Genera una línea del archivo sub line() { my $f_linea = rnd(100000, 99999999); my $f_minutos = rnd(1, 150); my $f_fecha = aaaa().mm().dd(); my $f_hora = dd().hh().MM(); my ($f_tipo, $f_orig, $f_dest) = ('', '', ''); if (rnd(1) == 1) { $f_tipo = 'E'; $f_orig = get_rnd_code(); } else { $f_tipo = 'S'; $f_dest = get_rnd_code(); } my $f_prest = char().char().char().char().char().char().char().char().char(); return "$f_linea;$f_minutos;$f_fecha;$f_hora;$f_tipo;$f_dest;$f_orig;$f_prest"; } #}}} #{{{ gen() - Genera un archivo con entre MIN y MAX llamadas # Uso: gen(MIN, MAX) sub gen($$) { my ($ini, $fin) = @_; my $file = aaaa().mm().dd().hh().MM().'.'.DDDD(); # Mientras exista uno, buscamos un nuevo nombre. $file = aaaa().mm().dd().hh().MM().'.'.DDDD() while (-e $file); open(FH, ">$file") or die("No puedo abrir el archivo $file!\n"); for (my $i = rnd($ini, $fin); $i > 0; --$i) { print FH line()."\n"; } } #}}} #}}} #{{{ Programa srand; my $cant = $ARGV[0] ? $ARGV[0] : $CANT_ARCHS; load_codes(); for (my $i = 0; $i < $cant; ++$i) { gen($ARGV[1] ? $ARGV[1] : $MIN_LINEAS, $ARGV[2] ? $ARGV[2] : $MAX_LINEAS); } #}}} # vim: set fdm=marker ts=4 sw=4 :