Cátedra: Osvaldo Clua
Fecha: Primera Oportunidad - Primer Cuatrimestre 2009
Día: 03/11/2009
Tema: 1
Leer un archivo de datos llamado “Cultivos” y obtener la sumatoria de las diferencias entre la superficie cultivada y la superficie cosechada por cultivo (sin importar el establecimiento) usando una estructura hash (el campo cultivo es el que se emplea como clave) y luego grabar un archivo de salida con los cultivos en donde la diferencia sea negativa.
Al invocar el comando se debe pasar como parámetro el nombre del archivo de salida.
Solicitar al usuario que ingrese por estándar input un código de zona y procesar sólo los registros que pertenecen a esa zona, el resto ignorarlos.
Condiciones de Resolución:
La estructura del archivo de cultivos es: Código de zona:Código de Establecimiento:Cultivo:Superficie cultivada:Rinde Esperado:Superficie cosechada:Rinde Obtenido
La estructura del archivo de zonas.tab es: Código de zona;Nombre de Zona
La estructura del archivo de salida.es es: Código de zona,Nombre de Zona,Cultivo,Direferencia Obtenida,Usuario de Grabación,Fecha de Grabación
#!/usr/bin/perl #~ GonchuB #~ 03-11-2009 #~ Perl my $archivo_cultivos = "Cultivos"; my $separador_cultivos = ":"; my $archivo_zonas = "zonas.tab"; my $separador_zonas = ";"; my $archivo; my $linea; my @lineas; #~ Se valida que el archivo de cultivos se pueda abrir en modo lectura. open(CULTIVOS, "<", $archivo_cultivos) || die "No se puede abrir el archivo de cultivos.\n"; $archivo = join( "", <CULTIVOS> ); @lineas = split( "\n", $archivo ); if( scalar @lineas == 0 ) { die "El archivo de cultivos esta vacio.\n"; } my $archivo_salida; my $separador_salida = ","; #~ Se pasa como parametro el archivo de salida. if( $#ARGV == -1 ){ die "Se debe pasar como parametro el archivo de salida.\n"; } else { $archivo_salida = $ARGV[0]; } #~ El archivo de salida ya existe. if( open(SALIDA, "<", $archivo_salida) ){ close(SALIDA); die "El archivo salida especificado ya existe.\n"; } open(ZONAS, "<", $archivo_zonas) || die "No se puede abrir el archivo de zonas.\n"; my %hash_zonas = (); my $codigo_zona; my $nombre_zona; #~ Lleno el hash codigo_zona : nombre_zona; $archivo = join( "", <ZONAS> ); @lineas = split( "\n", $archivo ); foreach $linea (@lineas) { ($codigo_zona, $nombre_zona) = split( $separador_zonas, $linea ); $hash_zonas{$codigo_zona} = $nombre_zona; } #~ Ingreso de codigo de zona por STDIN. my $codigo_zona_input; print "Ingrese el codigo de zona a filtrar: "; $codigo_zona_input = <STDIN>; #~ Valido que la zona exista en el archivo de zonas. if( ! exists($hash_zonas{$codigo_zona_input}) ){ die "No existe la zona ingresada.\n"; } #~ Variables extraidas del archivo de cultivos. my $codigo_establecimiento; my $cultivo; my $superficie_cultivada; my $rinde_esperado; my $superficie_cosechada; my $rinde_obtenido; my $diferencia; #~ Lectura del archivo de cultivos. my %hash_cultivos = (); $archivo = join( "", <CULTIVOS> ); @lineas = split( "\n", $archivo ); foreach $linea (@lineas) { ($codigo_zona,$codigo_establecimiento,$cultivo,$superficie_cultivada,$rinde_esperado,$superficie_cosechada,$rinde_obtenido) = split( $separador_cultivos, $linea ); $diferencia = $superficie_cultivada - $superficie_cosechada; if( $codigo_zona eq $codigo_zona_input ) { if( exists($hash_cultivos{$cultivo}) ){ $hash_cultivos{$cultivo} += $diferencia; } else { $hash_cultivos{$cultivo} = $diferencia; } } } my $username = getpwuid( $< ); my $time; #~ Itero el hash de cultivos. foreach $clave (keys(%hash_cultivos)) { $diferencia = $hash_cultivos{$clave}; $time = localtime; if( $diferencia < 0 ) { print SALIDA "$codigo_zona_input,$hash_zonas{$codigo_zona_input},$clave,$diferencia,$username,$time\n"; } }