Skip to main content

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);
       }

   }


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
avbravo said…
funciono a la perfección , saludos
Unknown said…
Hola, necesito ayuda! como funciona ese codigo?
avbravo 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 :)
Unknown 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
avbravo said…
Hola Borja te pondre en contacto con Diego Silva quien la desarrollo. Enviame un email a avbravo@gmail.com
Unknown 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
Anonymous 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.
Leonardo Camilo said…
muy buenas a todos, tengo un error con la linea:
Logger.getLogger(Foxpro.class.getName()).log(Level.SEVERE, null, ex);

cannot find symbol Foxpro

Soy nuevo en programacion y si pueden ayudarme sería genial.

Saludos,
Leonardo

Popular posts from this blog

Tutorial básico de aplicaciones Web con NetBeans parte 1

NetBeans ofrece un excelente soporte para el desarrollo de aplicaciones Web, en esta ocasión lo haremos utilizando el Framework Java Server Faces 2.0. En el Menu Seleccionamos Nuevo->Proyecto y luego en Categorias Java Web y en tipo de Proyectos Web  Application indicamos el nombre del proyecto Seleccinamos el servidor Web, usamos GlassFish ya que este soporta EJB3.0 y JSF 2.0 Framework Java Server Faces El IDE genera el esquelto del proyecto Web Pages   almacenamos las paginas .html, xhtml, jsf, los archivos de recursos, los scripts .js, imagenes Source Packages    Son las clases Java  Test Packages    Son las clases que usamos para los Test Libraries     Tenemos las bibliotecas de Java y GlassFish necesarias para ejecutar la aplicación Web. Test Libraries     Están las bibliotecas usadas para los test  Configuration Files    Archivos de configuración de la aplicación. Ejecutamos la...

Incrementar Memoria NetBeans

Algunas veces necesitamos incrementar la memoria para un mejor rendimiento. http://www.netbeans.org/community/releases/55/uml-download.html Este es un ejemplo para UML. Descripción en ingles. Increasing Memory Settings (applicable to all builds) The default memory settings for NetBeans should be increased for UML projects. If you have the available memory, Locate your NetBeans installation directory ($install_dir). This can be found by starting up NetBeans and selecting Help -> About then select the Detail tab. Edit the $install_dir/etc/netbeans.conf file. Find the line defining netbeans_default_options . Increase the maximum memory attribute to -J-Xmx512m. If you experience heap overflows while working with larger files, you should increase this value further.

Cambiando el estado de un checkbox

Cambiando el Estado de un CheckBox Algunas veces deseamos controlar el estado de un checkbox o cambiarlo segùn determinadas condiciones. Pasos: 1. Creamos un proyecto Web. 2. En el diseñador agregamos un checkbox y dos botones. * Dar click derecho en el checkbox y luego seleccionar Add Binding Attribute, para agregar los atributos al checkbox, de manera que los podamos usar en nuestro código. Generando automáticamente private Checkbox checkbox1 = new Checkbox(); public Checkbox getCheckbox1() { return checkbox1; } public void setCheckbox1(Checkbox c) { this.checkbox1 = c; } 3.Damos click derecho en el botón Habilitar, y seleccionamos Edit Action Event Handler. A continuación, agregamos el código: this.checkbox1.setSelected(true);, el método setSelected con valor true, marca el checkbox como seleccionado, y un valor de false, quita la marca. public String button1_action() { // TODO: Process the action. Return value is a navigation // ...