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);
}
}
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
ya me había olvidado de ese código :)
Espero que te sea útil, amigo
Espero que te sea útil
ya me había olvidado de ese código :)
Espero que te sea útil, amigo
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);
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.
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.
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.
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
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
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
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.
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