Convertir DBF a CVS con perl
Hay muchas aplicaciones viejas que guardan celosamente sus datos en el vetusto formato DBF.
De cara a las migraciones puede resultar interesante pasar esos datos a un GBD relacional. Algunas ya tienen herramientas capaces de leer ficheros DBF, pero si no es asi podemos crear unos CVS para importar los datos facilmente.
Este pequeño programa perl se le indica un directorio donde hay ficheros DBF y los convierte de uno en uno. Tiene distintas opciones como el separador de campos, todo ello explicado en el propio codigo. Es necesaria la libreria xbase.
No se ha testeado mucho, asi que at your own risk
#!/usr/bin/perl # dbf2csv.pl # programita perl para convertir un grupo de ficheros en formato dbf # a formato cvs. Se requierea la libreria xbase para la lectura de dbf. # De cada fichero DBF se genera otro en formato CVS con la extension CVS, # y se guarda donde se le indique al ejecutar. Por defecto va al mismo directorio # Pello Xabier Altadill Izura - http://www.pello.info use XBase; # Los argumentos que espera el programa: # 1: Separador para el fichero # 2: Path del directorio donde se encuentran los ficheros DBF sin slash al final # 3: 0 o 1, boolean para indicar si queremos cabeceras (nombres de campos y tipos) # 4: directorio de resultado donde se guardan los CVS # 5: si queremos que muestre por pantalla los datos que se van sacando print " DBF2CSV.PL - Conversor de DBF a CVS - www.pello.info "; print "uso: ./dbf2cvs.pl [separador] [path] [cabecera 0,1] [outputdir] [verboso 0,1] "; my $separador = ($ARGV[0] eq "")?";":$ARGV[0]; my $path = ($ARGV[1] eq "")?".":$ARGV[1]; my $cabeceras = ($ARGV[2] eq "")?1:$ARGV[2]; my $output = ($ARGV[3] eq "")?".":$ARGV[3]; my $verboso = ($ARGV[4] eq "")?0:$ARGV[4]; print "Separador: $separador, path: $path, cabeceras: $cabeceras, outputdir: $output "; # Ficheros my @ficheros = <${path}/*.DBF>; foreach $fichero (@ficheros) { print "Generando $fichero... "; my $table = new XBase "$fichero" or die XBase->errstr; my $ficherocvs = "$output/$fichero.cvs"; open DATA, ">$ficherocvs" or die "Error, no se pudo crear fichero de resultado $ficherocvs $! "; my @campos = $table->field_names; my @tipos = $table->field_types; my @longitudes = $table->field_lengths; if ($cabeceras == 1) { # Sacamos los campos foreach $item (@campos) { escribe("$item$separador"); } escribe(" "); # Sacamos los tipos foreach $item (@tipos) { escribe("$item$separador"); } escribe(" "); } # Sacamos los datos my $cursor = $table->prepare_select(); while (my @datos = $cursor->fetch) { foreach $registro (@datos) { escribe("$registro$separador"); } escribe(" "); } print " OK fichero $fichero.cvs generado. "; close(DATA); }#end foreach de ficheros print " OK, gracias por utilizar dbf2cvs.pl "; # Escribe en el fichero de resultado # y en salida estandar a menos que verbose este desactivado sub escribe { my ($contenido) = @_; print DATA $contenido; print($contenido) unless !$verboso; }