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;
}
pello.io