Re: [pgsql-ayuda] Sobre DBF y postgres

From: La Mancha de la Calabaza que Ladra <mancha(at)galois(dot)baras(dot)ml(dot)org>
To: pgsql-ayuda(at)tlali(dot)iztacala(dot)unam(dot)mx
Subject: Re: [pgsql-ayuda] Sobre DBF y postgres
Date: 1998-12-10 22:06:55
Message-ID: 199812102206.QAA19929@galois.dgst.ddf.gob.mx
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda


> 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 podras usar algo del estilo al script en Perl que te anexo. Es
un hack rpido y malo, pero me ha servido montones... No tengo tiempo
de hacerlo en forma en este momento, pero creo que es lo
suficientemente fcil de entender como para que t lo parches y lo
redistribuyas. Lo que le falta es que al leer el header, lo reescriba
en trminos 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 fcil 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, magnfico imbcil\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.Magarios

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

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message La Mancha de la Calabaza que Ladra 1998-12-10 22:12:42 Re: [pgsql-ayuda] Sobre DBF y postgres
Previous Message Montse 1998-12-10 05:52:32 [pgsql-ayuda] acceder a la bd