Leer una DBF con Java

By | 05/15/2012

Me encontré con la necesidad de leer un archivo de tipo “dbf” (dBase) y buscando un poco encontre esta librería que me resolvio el problema. http://dans-dbf-lib.sourceforge.net/
El jar lo puedes descargar desde http://sourceforge.net/projects/dans-dp-lib/files/

A modo de ejemplo alcanza con observar esta clase…

import nl.knaw.dans.common.dbflib.Field;
import nl.knaw.dans.common.dbflib.IfNonExistent;
import nl.knaw.dans.common.dbflib.Record;
import nl.knaw.dans.common.dbflib.Table;
import nl.knaw.dans.common.dbflib.Type;
 
/**
 * Read DBF File
 * @author Gustavo
 */
public class ReadDBF implements IRead {
 
	@Override
	public void read(File fileToRead, IRecordData rec) throws Exception {
 
		Table table = new Table(fileToRead);
 
		try {
			table.open(IfNonExistent.ERROR);
 
			List<Field> fields = table.getFields();
 
			Iterator<Record> iterator = table.recordIterator();
			while (iterator.hasNext()) {
 
				Record record = iterator.next();
 
				final Map<String, Object> m = new HashMap<String, Object>();
				for (Field field : fields) {
 
					Object value;
					if (Type.LOGICAL.equals(field.getType())) {
						value = record.getBooleanValue(field.getName());
					} else if (Type.NUMBER.equals(field.getType())) {
						value = record.getNumberValue(field.getName());
					} else if (Type.CHARACTER.equals(field.getType())) {
						value = record.getStringValue(field.getName());
					} else if (Type.DATE.equals(field.getType())) {
						value = record.getDateValue(field.getName());
					} else if (Type.FLOAT.equals(field.getType())) {
						value = record.getNumberValue(field.getName());
					} else if (Type.GENERAL.equals(field.getType())) {
						value = record.getStringValue(field.getName());
					} else if (Type.BINARY.equals(field.getType())) {
						// no implementado
						value = null;
					} else if (Type.PICTURE.equals(field.getType())) {
						// no implementado
						value = null;
					} else if (Type.MEMO.equals(field.getType())) {
						// no implementado
						value = null;
					} else {
						throw new Exception(
								"No se reconoce el tipo de dato para el campo "
										+ field.getName());
					}
					m.put(field.getName(), value);
				}
				rec.data(m);
			}
		} finally {
			table.close(); // siempre cerrar!!
		}
	}
}

La clase la tengo definida en un bean de Spring, por eso implementa la una interfaz IRead que tienen solo el método read(File fileToRead, IRecordData rec)

Con JUnit hago una prueba…

 
import service.IRead;
import service.IRecordData;
 
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/application-context.xml" })
public class TestReadDBF {
 
	@BeforeClass
	public static void setup() {
	}
 
	@Autowired
	@Qualifier("readFile")
	private IRead readFile; // bean de Spring
 
 
	@Test 
	public void simpleTest() throws Exception {
 
		readFile.read(new File("c://test/fileDBFTest.dbf"), new IRecordData() {
			@Override
			public void data(Map<String, Object> m) {
				Set<Entry<String, Object>> dataSet = m.entrySet();
				for (Entry<String, Object> value : dataSet) {
					System.out.print(value.getKey() + " : " + value.getValue()
							+ " | ");
				}
				System.out.println("--------");
			}
		});
 
	}
 
	@AfterClass
	public static void endClazz() {
		// ...
	}
 
}
Compartir esto:

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *