Wednesday, December 12, 2012

Leer dbf desde Java

Cuando necesites leer bases de datos de Foxpro desde Java, mi amigo Diego Silva creo hace un tiempo una librería muy útil para comunicarnos con los archivos dbf
http://www.apuntesdejava.com/2007/09/dbf-2-java-library.html

Descargamos el archivo .jar  desde https://code.google.com/p/dbf2java-library/
Agregamos el jar al proyecto, y seguimos los siguientes pasos

 public static void main(String[] args) throws IOException {
       try {
           // TODO code application logic here
           DbfFile bfile;
      bfile = new DbfFile("/home/avbravo/empresas.dbf");
// abrir el archivo
           bfile.open();
          System.out.println(" contador " + bfile.getCount());
//recorrer los registros
           for (int i = 0; i < bfile.getCount(); i++) {
//colocar el cursor en el registro
               bfile.go(i);
               Map<String, String> map = bfile.scatter();
               Iterator it = map.keySet().iterator();

               while (it.hasNext()) {
                   // Get Clave
                   String clave = (String) it.next();
                   String valor = map.get(clave);
                   System.out.println(clave+ " --> "+valor);

                 

               }
           }
       } catch (FileNotFoundException ex) {
           Logger.getLogger(Foxpro.class.getName()).log(Level.SEVERE, null, ex);
       }

   }


17 comments:

Diego Silva said...

hey!
ya me había olvidado de ese código :)

Espero que te sea útil, amigo

Diego Silva said...

Hey! ya me había olvidado de ese código!

Espero que te sea útil

Diego Silva said...

hey!
ya me había olvidado de ese código :)

Espero que te sea útil, amigo

aristides villarreal said...

funciono a la perfección , saludos

Ricardo Melendez Vargas said...

Hola, necesito ayuda! como funciona ese codigo?

aristides villarreal said...

Ricardo necesitas indicar la ruta del archivo .dbf
bfile = new DbfFile("/home/avbravo/empresas.dbf");
dentro del while podemos obtener la clave es decir el nombre de la columna en la tabla (dbf) y el valor correspondiente al mismo.
String clave = (String) it.next();
String valor = map.get(clave);

Javier said...

Hola a todos.

Lo primero agradecer la aportacion, creo que sera de gran utilidad para aquello que me propongo hacer.

Lo segundo es que usando el codigo de ejemplo trato de leer una tabla y nada mas al abrirla ya me da una excepcion:

java.lang.ArrayIndexOutOfBoundsException: 3072
******************************************************************
try {

DbfFile bfile;
bfile = new DbfFile("C:/DATOS_IESA/DATOS/COMUNI.DBF");

// abrir el archivo
System.out.println("DEBUG 2");
bfile.open(); <-- ESTE ES EL PUNTO DONDE ME DA ERROR
System.out.println("DEBUG 3");

...
}

Lo curioso es que en otra tabla que es mucho mas grande, pero notablemente mas, no he tenido ningun problema a la hora de leerla de principio a fin.

Como dato uso java 7 y la base de datos esta en visual foxpro 9.

Saludos.

Javier said...

Hola a todos.

Lo primero agradecer la aportacion, creo que sera de gran utilidad para aquello que me propongo hacer.

Lo segundo es que usando el codigo de ejemplo trato de leer una tabla y nada mas al abrirla ya me da una excepcion:

java.lang.ArrayIndexOutOfBoundsException: 3072
******************************************************************
try {

DbfFile bfile;
bfile = new DbfFile("C:/DATOS_IESA/DATOS/COMUNI.DBF");

// abrir el archivo
System.out.println("DEBUG 2");
bfile.open(); <-- ESTE ES EL PUNTO DONDE ME DA ERROR
System.out.println("DEBUG 3");

...
}

Lo curioso es que en otra tabla que es mucho mas grande, pero notablemente mas, no he tenido ningun problema a la hora de leerla de principio a fin.

Como dato uso java 7 y la base de datos esta en visual foxpro 9.

Saludos.

Javier said...

Hola a todos,

lo primero queria agradecer este aporte que creo puede ser de gran ayuda para el trabajo que quiero realizar.

Cuando el codigo de ejemplo, al leer una tabla me da una excepcion justo en el momento de hacerle el open:

java.lang.ArrayIndexOutOfBoundsException: 3072

**************************************************************

try {

DbfFile bfile;
bfile = new DbfFile("C:/DATOS_IESA/DATOS/COMUNI.DBF");
// abrir el archivo
System.out.println("DEBUG 2");
bfile.open(); <--- aqui esta el fallo
System.out.println("DEBUG 3");

...
}

**************************************************************

Como informacion adicional dire que uso java7 y visual foxpro 9

Saludos y gracias por adelantado.

Miguel Araujo said...

Genial, tu aportación...muchas gracias :)

Miguel Araujo said...

Genial, hasta ahora me ha funcionado muy bien...muchos saludos y muchas gracias, saludos desde México.

Miguel Araujo said...

Genial, tu aportación...muchas gracias :)

Borja Rosales Maestre said...

Hola,

No se porque pero me da un error en la función
private static byte[] extractArray(byte[] data, int from, int count) {
byte[] $ret = new byte[count];
for (int i = 0; i < count; i++) {
$ret[i] = data[from + i];
}
return $ret;
}
el from tiene como valor 1085145097 y lanza una excepción por exceder las posiciones del array.

Ese from se calcula
f.offset = array2integer(new byte[]{data[12], data[13], data[14], data[15]});

private static int array2integer(byte[] bs) {
int ret = 0;
for (int i = 0; i < bs.length; i++) {
ret |= ((bs[i] & 0x0ff) << (i * 8));
}
return ret;
}

y no se porque toma ese valor.

¿alguien puede echarme una mano?

Gracias

aristides villarreal said...

Hola Borja te pondre en contacto con Diego Silva quien la desarrollo. Enviame un email a avbravo@gmail.com

Emanuel Esteves said...

Este erro parece ter a ver com o numero de campos na tabela DBF (mais de 94 campos causa este erro).

A forma correta de indicar o nome da tabela é, por exemplo:

bfile = new DbfFile("C:\\PCFFILES\\DATA\\PCFCLI.DBF");

Estou a usar o Windows 8.1 64 bits
Netbeans IDE 8.0.2
Java 1.8.0_45

Diego Silva said...

Hola Emanuel
Gracias por sus comentarios. También me han reportado ese error por otros medios. Al inicio lo cree bajo el estándar de los DBF antiguos (que existieron en los años 80 y 90)

Voy a revisar el código para que la biblioteca soporte más campos.

Si me envían un ejemplo de un archivo .dbf a mi correo (diego.silva@apuntesdejava.com) será de gran ayuda para mejorar el código

Saludos

Tatiana Paola Hernández Casseres said...

Hola buenas tardes Diego.
Muchas gracias por el aporte, me ha servido mucho.
Solo tuve un inconveniente, cuando el archivo dbf contiene columnas de tipo timestamp la librería no las lee de forma correcta, en lugar de devolver la fecha con el formato indicado: dd/mm/yyyy hh:mm:ss devuelve caracteres especiales.

¿Podría indicarme como solucionarlo?

Mil gracias.