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
funciono a la perfección , saludos
Hola, necesito ayuda! como funciona ese codigo?
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 :)
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
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
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.

Popular posts from this blog

Apache NetBeans

Apache NetBeans
https://wiki.apache.org/incubator/NetBeansProposal

Si, algo que se esperaba desde hace muchos años, una liberación de NetBeans, para convertirlo en un IDE más abierto, y que permita mayor contribución de la comunidad y de otras empresas, ya inicio su primera etapa en la incubadora de la Fundación Apache.
Las implicaciones que esto conlleva son múltiples por una parte esta la evolución de NetBeans, al permitir que más contribuyentes puedan aportar a sus mejoras, también garantiza que aquellas instituciones no sientan que es una sola organización la que controla la evolución. A las comunidades les permite sentirse que participan de un proyecto con todas las garantías que ofrece la Fundación Apache.

Muchos pensaran que Oracle esta dejando morir el proyecto, la realidad es diferente, hay muchos ingenieros que están participando del proyecto en la fundación Apache.
Es una noticia excelente para los desarrolladores, instituciones, empresas que utilizan NetBeans , se estima qu…

Un ejemplo sencillo de Refactorización y Genericos

Un ejemplo sencillo de Refactorización y Genericos

public class Refactorizador<K, V> {

    public V copyFromBeans(K k, V v) {
        try {
            Class claseK = k.getClass();
            Class claseV = v.getClass();

            Method[] metodosK = claseK.getMethods();

            for (Method method : metodosK) {
                if (isGetter(method)) {
                    Method metodoGetK = claseK.getDeclaredMethod(method.getName());
                    Method metodoSetV = claseV.getDeclaredMethod(changeGetBySet(method.getName()), method.getReturnType());
                    metodoSetV.invoke(v, metodoGetK.invoke(k));
                }

            }

        } catch (Exception e) {
            System.out.println("refactorizador() " + e.getLocalizedMessage());
        }
        return v;
    }

     public  boolean isGetter(Method method) {

        if (!method.getName().startsWith("get")) {
            return false;
        }
        if (method.getName().startsWith("getCla…

FileUpload con Primefaces

FileUpload con Primefaces

Si queremos subir imagenes a nuestra aplicación usaremos el componente FileUpload Debemos realizar los siguientes pasos:
Agregar al archivo web.xml

   <filter>        <filter-name>PrimeFaces FileUpload Filter</filter-name>        <filter-class>            org.primefaces.webapp.filter.FileUploadFilter        </filter-class>    </filter>    <filter-mapping>        <filter-name>PrimeFaces FileUpload Filter</filter-name>        <servlet-name>Faces Servlet</servlet-name>    </filter-mapping>



Crear dentro de resources el directorio donde deseamos almacenar las imagenes En este ejemplo: resources/fotos/clinicas y agregue una imagen llamada fotos.png que se usará como imagen inicial.



En JSFUtil u otro @Named Beans que usemos agregamos tres métodos uno para obtener el path de la aplicación web , otro para obtener el path relativo a /fotos/clinicas y el otro para copiar los archivos. /*