Exercise
DBF extractor
Objetive
Create a program that displays the list of fields stored in a DBF file.
The DBF format is used by the old dBase database manager and is still supported as an export format by many current tools, such as Excel or Access.
DBF files are divided into two parts: a header that stores information about the structure of the file and a data zone.
The header zone is separated from the data zone with the CR character (carriage return, number 13 of the ASCII code). The header is divided into two parts: the first occupies 32 bytes and contains general information about the file, while the second contains information about each field and is made up of as many blocks of 32 bytes as there are fields in the table.
The general header of the file is:
Position Size (bytes) Description
1 1 Number that identifies the product with which the table was created
2 3 Last update date in the format of year/month/day
5 4 Total number of records in the table (in reverse order)
9 2 Total length of the header, including CR
11 2 Length of each record, including the delete flag character
13 2 Reserved
15 1 Active Transaction Flag
16 1 Encryption Flag
17 12 Indicators for local area network use
29 1 Flag indicating whether the file has an associated .MDX file
30 3 Reserved
The header of each field is:
Position Size (bytes) Description
1 11 Field Name
12 1 Field Type (C, D, F, L, M, N)
13 4 Reserved
17 1 Field Length
18 1 Number of decimal places if the field is numeric; also used for large character fields
19 2 Reserved
21 1 Work area Flag
22 10 Reserved
32 1 Flag indicating inclusion in the index .MDX
(Note that the number of fields is not indicated in the header, but it can be deduced by knowing the length of the header, which is in positions 9 and 10, and the size of each header block, which is 32 bytes.)
Example Code
public class Main
{
public static void main()
{
java.io.FileInputStream fileDBF = File.OpenRead("example.dat");
byte[] data = new byte[32];
int amountRead = fileDBF.read(data, 0, 32);
if (amountRead != 32)
{
System.out.println("Error!!!");
}
else
{
size = data[8] + data[9] * 256;
int numberFields = size / 32 - 1;
for (int i = 0; i < numberFields; i++)
{
amountRead = fileDBF.read(data, 0, 32);
String nameField = "";
for (int j = 0; j < 11; j++)
{
nameField += (char)data[j];
}
System.out.printf("Name: %1$s" + "\r\n", nameField);
}
fileDBF.close();
}
}
}