[pgsql-ayuda] Sobre DBF y postgres

La Mancha de la Calabaza que Ladra mancha@galois.baras.ml.org
Thu, 10 Dec 1998 16:06:55 -0600


>  Tenemos por aca una aplicacion de un sistema estadistico
>  financiero, donde para las bases de datos usamos postgres
>  y acceso mediante WWW, logicamente antes de aparecer 
>    postgres estas se almacenaban utilizando otros sistemas
>  que almacenaban las bases en formato dbf, quisiera saber 
>  si hay alguna herramienta para lograr convertir estos
>dbf a postgres de una forma directa, ya que se existen sistemas
>donde pudiera llevar los dbf a query y de ahi entonces a postgres
>, pero lo que quiero es pasarla de forma directa.

Pues podrías usar algo del estilo al script en Perl que te anexo. Es
un hack rápido y malo, pero me ha servido montones... No tengo tiempo
de hacerlo en forma en este momento, pero creo que es lo
suficientemente fácil de entender como para que tú lo parches y lo
redistribuyas. Lo que le falta es que al leer el header, lo reescriba
en términos que comprenda postgres y lo emita, junto con los campos
separados por tabs y con una linea con \. al final para que lo puedas
pasar como entrada al psql. Está todo muy fácil de hacer.

===File ~/bin/ldbf.pl=======================================
#!/usr/bin/perl

use Getopt::Std;
getopts('h');
$headers = (defined $opt_h) ? 1 : 0;

$nombre = shift @ARGV;
open (ENT, $nombre) || die "Noncuentro $nombre, magnífico imbécil\n";
seek (ENT, 0, 0);
read (ENT, $head, 32);
($tipo, $ano, $mes, $dia, $numrec, $data_offset, $data_length) = unpack ("CCCCVvv", $head);
$mes = ($mes < 10) ? "0$mes" : $mes;
$dia = ($dia < 10) ? "0$dia" : $dia;
$numcamp = ($data_offset - 33) / 32;
print STDERR "Tipo:  $tipo\n";
print STDERR "Fecha: $ano$mes$dia\n";
print STDERR "#reg:  $numrec\n";
print STDERR "#camp: $numcamp\n";
print STDERR "Lreg:  $data_length\n";
seek (ENT, 32, 0);
foreach $i (0..$numcamp) {
    read (ENT, $field, 32);
    ($nomcamp) = unpack ("A*", substr ($field, 0, 10));
    ($tipo, $d2, $d3, $d4, $d5, $tamcam, $d7) = unpack ("ACCCCCC", substr ($field, 11));
    $NomCam[$i]  = $nomcamp;
    $TipoCam[$i] = $tipo;
    $TamCam[$i]  = $tamcam;
}
read (ENT, $data, 2);
if ($headers) {
    foreach $i (0..$numcamp - 1) {
	print "\"$NomCam[$i]\",";
	print STDERR "$NomCam[$i], $TipoCam[$i], $TamCam[$i]\n";
    }
    print  "\"$NomCam[$i]\"\n";
    print STDERR "$NomCam[$i], $TipoCam[$i], $TamCam[$i]\n";
}
foreach $i (0..$numrec) {
    read (ENT, $data, $data_length);
    $acum = 0;
    @lista = ();
    foreach $j (0..$numcamp) {
	$dato = substr ($data, $acum, $TamCam[$j]);
	if ($TipoCam[$j] eq 'C') {
	    $dato =~ s/^\s+//;
	    $dato =~ s/\s+$//;
	    push (@lista, "\"$dato\"");
	} elsif ($TipoCam[$i] eq 'D') {
#	    print "$dato";            # soy un cerdo...
	    push (@lista, "\"$dato\"");
	} else {
	    $dato += 0;
#	    print "$dato";            # peor que un cerdo...
	    push(@lista, "\"$dato\"");
	}
	$acum += $TamCam[$j];
    }
    print join (',', @lista), "\n";
}
close (ENT);
============================================================

--
La Mancha, http://breogan.iimas.unam.mx/~mancha
casa://AvRevolucion.1761.depto.5/~mancha
ring://550-2547.df.telmex.com.mx/~pedir.por.mancha
chamba://cubo-320.iimas.unam.cu/~mancha
rechamba://533-3035.df.telmex.com.mx/~pedir.por.Sr.Magariños

--------- Pie de mensaje -------------------------------------------
Archivo historico: http://tlali.iztacala.unam.mx/maillist/pgsql-ayuda
Cancelar inscripcion:
mail to: majordomo@tlali.iztacala.unam.mx
text   : cancelacion pgsql-ayuda