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;

}