Objectivo
Crear un programa que muestre la lista de los campos que hay almacenados en un fichero DBF.
El formato DBF es el usado por el antiguo gestor de bases de datos dBase, y soportado como formato de exportación por muchas herramientas actuales, como Excel o Access.
Los archivos DBF se dividen en dos partes: una cabecera que almacena información sobre la estructura del archivo y una zona de datos.
La zona de cabecera se separa de la zona de datos con el carácter CR (avance de carro, número 13 del código ASCII). A su vez la cabecera se divide en dos partes: la primera ocupa 32 bytes y contiene información general sobre el archivo, mientras que la segunda contiene información sobre cada campo y está formada por tantos bloques de 32 bytes como campos tenga la tabla.
La cabecera general del archivo es:
Posicion Tamaño (bytes) Descripcion
1 1 Nro. que identifica el producto con el fue creada la tabla
2 3 Fecha ultima actualizacion año/mes/dia
5 4 Nro.total de registros de la tabla (en orden inverso)
9 2 Longitud total de la cabecera incluido CR
11 2 Longitud del registro (incluye el caracter de marca de borrado)
13 2 Reservados
15 1 Flag de Transaccion activa
16 1 Flag de encriptacion
17 12 Indicadores para el uso en red de area local
29 1 Flag de fichero de indica .MDX
30 3 Reservados
La cabecera de cada campo es:
Posicion Tamaño (bytes) Descripcion
1 11 Nombre de Campo
12 1 Tipo de campo (C,D,F,L,M,N)
13 4 Reservados
17 1 Longitud de campo
18 1 Numero de decimales si el campo numerico,tambien usado para campos de caracteres de gran tamaño
19 2 Reservados
21 1 Flag de area de trabajo
22 10 Reservados
32 1 Flag de inclusion en el indice .MDX
(Se puede observar que la cantidad de campos no se indica en la cabecera, pero se puede deducir, sabiendo la longitud de la cabecera, que está en las posiciones 9 y 10, y el tamaño de cada bloque de cabecera, que es de 32 bytes).
Ejemplo Ejercicio C#
Mostrar Código C#
// Importing necessary namespaces
using System;
using System.IO;
using System.Text;
class DBFExtractor
{
// Main method where the program execution begins
static void Main()
{
// File path (change this to the DBF file you want to extract fields from)
string filePath = "example.dbf";
// Call the ExtractFields method to display the list of fields from the DBF file
ExtractFields(filePath);
}
// Method to extract and display the list of fields from the DBF file
static void ExtractFields(string filePath)
{
try
{
// Open the DBF file in binary read mode
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
// Read the general header (32 bytes)
byte[] header = new byte[32];
fs.Read(header, 0, 32);
// Extract the total length of the header (in bytes) from positions 9-10 (little-endian)
int headerLength = BitConverter.ToInt16(header, 9);
// The number of fields can be deduced from the header length
int fieldCount = (headerLength - 32) / 32;
// Skip to the start of the field headers
fs.Seek(32, SeekOrigin.Begin);
// Read each field header (32 bytes per field)
for (int i = 0; i < fieldCount; i++)
{
byte[] fieldHeader = new byte[32];
fs.Read(fieldHeader, 0, 32);
// Extract field name (first 11 bytes)
string fieldName = Encoding.ASCII.GetString(fieldHeader, 0, 11).Trim();
// Extract field type (12th byte)
char fieldType = (char)fieldHeader[11];
// Extract field length (17th byte)
byte fieldLength = fieldHeader[16];
// Display the extracted field information
Console.WriteLine($"Field {i + 1}: Name = {fieldName}, Type = {fieldType}, Length = {fieldLength}");
}
}
}
catch (Exception ex)
{
// Catch any errors (like file not found) and display the error message
Console.WriteLine("Error: " + ex.Message);
}
}
}
Salida
Field 1: Name = ID, Type = N, Length = 5
Field 2: Name = Name, Type = C, Length = 20
Field 3: Name = Age, Type = N, Length = 3
Field 4: Name = Address, Type = C, Length = 30
Código de Ejemplo Copiado!
Comparte este Ejercicio C# Sharp