Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Lectura de fichero clipper (https://www.clubdelphi.com/foros/showthread.php?t=41930)

Isabel_AS 29-03-2007 13:00:09

Lectura de fichero clipper
 
Hola:
Estoy intentando leer un fichero e interpretar los datos que contiene para incorporarlos a mi BD pero no lo consigo del todo.

El fichero en cuestión proviene de una aplicación hecha en clipper para msdos y contiene información en texto y en ??.

Me gustaría coger la información que "entiendo" y saltarme el resto hasta el siguiente "¿registro?", pero no soy capaz de leer el marcador que hay antes de cada código de cliente desde delphi.

No suelo trabajar con ficheros y me estoy haciendo un lío con los File, TextFile y File of, no se cuál de ellos usar.

El marcador que hay antes de cada código es una cadena de 00 en hexadecimal (en algunos casos 32 seguidos y en otros más).

Mi código de momento está en este punto:

procedure TfrmMain.Convierte;
var
i, nNulo: integer;
Ch: WideChar;
FPaciente : TextFile;
begin
// Abrimos el fichero @PACIENT
AssignFile(FPaciente, RutaOrigen + '@PACIENT');
Reset(FPaciente);
...
// Aquí leo datos de texto conocidos
for i := 1 to 4 do begin
Read(FPaciente, Ch);
MyCodigo := MyCodigo + Ch;
end;
// Nombre
MyNombre := '';
for i := 1 to 30 do begin // [ 5.. 34] Nombre = Nombre
Read(FPaciente, Ch);
MyNombre := MyNombre + Ch;
end;
...
// Cuando llego a los caracteres especiales me los quiero saltar hasta encotrar los nulos y el código siguiente
repeat
// Intento leer hasta el final del registro
nNulo := 0;
repeat
Read(FPaciente, Ch);
if (Ch = $00) then <-- Esta comparación es la que no se hacer
nNulo := nNulo + 1
else
nNulo := 0;
until (nNulo >= 32);
// Quiero llegar al final de los nulos (porque a veces hay más de 32)
repeat
Read(FPaciente, Ch);
until (Ch <> $00);

// Intento leer el código siguiente
MyCodigo2 := '';
MyCodigo2 := MyCodigo2 + Ch;
for i := 1 to 3 do begin
Read(FPaciente, Ch);
MyCodigo2 := MyCodigo2 + Ch;
end;
until ((StrToInt64Def(MyCodigo2, -1) <> -1)); // Si lo siguiente a los nulos no es un código, sigo leyendo...
...
end;

¿Alguna ayuda, por favor? Muchas gracias.

afxe 29-03-2007 14:21:43

Lectura ficheros clipper.
 
Hace algunos años tuve que hacer algo parecido. Encontré una librería de componentes de acceso a datos XBase (clipper, foxpro, dbase...) que me permitían abrir los ficheros clipper, como si fueran tablas paradox. Se llamaba Apollo. He visto algo aquí: http://www.abox.com/productos.asp?pid=78 no obstante, yo la obtuve gratuíta (creo que estaba acotada en tiempo)

Saludos.

fjcg02 30-03-2007 00:06:07

Según los datos que manejo, los datos de clipper son archivos .dbf. Sin tener que entrar en 'interpretarlos'`por código directamente, es un estandard que se puede leer con múltiples programas.
Excel, importarlos desde acces, crear un odbc para utilizarlo con el programa que quieras, ...
Desde delphi hay acceso directo con el objeto Ttable y TQuery, indicando como BBDD el directorio donde se encuentra el fichero, siendo cada fichero dbf del directorio una tabla.

Suerte y un saludo

Isabel_AS 30-03-2007 11:11:29

Gracias por las respuestas.

El caso es que no se trata de ficheros .dbf. Son unos ficheros sin extensión, cuyo nombre empieza por @, como @CONSULT, también hay otros ficheros con extensiones raras (.RDI, .RDD, .DOV, .CFG, ...), pero se que los datos que busco están en los ficheros sin extensión.

De momento he seguido por el camino que comentaba al principio, usando para la comparación que no sabía hacer la función CompareMem:
CompareMem(@Ch, @Nulo, 1);
y chequeando si es final de fichero antes de cada lectura, y no va del todo mal.... ¡¡hasta que me dice que es es el final del fichero sin serlo!!

AzidRain 30-03-2007 17:37:21

Las extensiones no indican necesariamente el formato en que se encuentran almacenados los datos. Si es Clipper forzosamente algunos de esos archivos no son mas que DBFs con extensiones cambiadas.

Entre las que mencionas RDI y RDD son manejadores de Clipper que le permiten crear tablas de diferentes sabores (Clipper, Fox, etc.) así que esos no tienen caso. Prueba abrirlas con DataBase desktop, aunque tengan extensiones no DBF...verás que mas de una si podras abrirla.

Isabel_AS 02-04-2007 10:58:53

Ooohhh, AzidRain, lo primero que he probado al llegar al trabajo ha sido probar a cambiar las extensiones, pero no va, el DataBase Desktop me dice lo de "Unable to open table", "Corrupt table/index header".

Sigo con mi camino inicial, el problema que tenía de que cree que es el final del fichero sin serlo aún, lo he solucionado leyendo todo y escribiéndolo en un fichero auxiliar quitando los valores (en hexadecimal) $1A que es donde se "atascaba" mi 'lector'.

Isabel_AS 03-04-2007 17:57:44

De nuevo vengo a pedir ayuda con el mismo tema.

En el fichero que estoy tratando ahora me encuentro con que hay datos en ASCII y otros, que, según me han dicho, son de "simple precisión" y de "doble precisión", numéricos, claro, por la información que espero que contengan. El caso es que al usar mi rutina de lectura veo esos datos como caracteres extraños (poniendo un ejemplo, así: @ì; que en hexadecimal sería: 40 1C 8D 00 40 1C 8D 00 00 40 1C 8D).

¿Cómo puedo hacer para leer esos datos como numéricos?

fjcg02 04-04-2007 00:30:43

has probado con el mitico DBU de clipper ? Con este programa visualizas el contenido de los ficheros de dbase-clipper así como su cabaecera, que indica la estructura del fichero.


Estructura del registro de encabezado de la tabla
Desplazamiento de bytes Descripción
0 Tipo de archivo
0x02 FoxBASE
0x03 FoxBASE+/dBASE III PLUS, sin memo
0x30 Visual FoxPro
0x43 dBASE IV SQL archivos de tabla, sin memo
0x63 dBASE IV SQL archivos de sistema, sin memo
0x83 FoxBASE+/dBASE III PLUS, con memo
0x8B dBASE IV con memo
0xCB dBASE IV SQL archivos de tabla, con memo
0xF5 FoxPro 2.x (o anterior) con memo
0xFB FoxBASE
1 – 3 Última actualización (YYMMDD)
4 – 7 Número de registros de un archivo
8 – 9 Posición del primer registro de datos
10 – 11 Longitud de un registro de datos (incluyendo el indicador de eliminación)
12 – 27 Reservado
28 Indicadores de tabla
0x01 el archivo tiene un .cdx estructural
0x02 el archivo tiene un campo Memo
0x04 el archivo es una base de datos (.dbc)
Observe que este byte puede contener la suma de
cualquiera de los valores anteriores. Por ejemplo, 0x03
indica que la tabla tiene un .cdx estructural
y un campo Memo.
29 Marca de página de códigos
30 – 31 Reservado, contiene 0x00
32 – n Subregistros de campo
El número de campos determina el número de subregistros de campo. Hay un subregistro de campo por cada campo de la tabla.
n+1 Final de registro de encabezado (0x0D)
n+2 a n+264 Intervalo de 263-bytes que contiene la información de vínculo anterior (la ruta de acceso relativa de una base de datos asociada (.dbc)). Si el primer byte es 0x00, el archivo no está asociado a una base de datos. Por lo tanto, las bases de datos siempre contienen el 0x00.

1 1 En el archivo de datos, los datos comienzan en la posición indicada por los bytes 8 a 9 del registro de encabezado. Los registros de datos comienzan con un byte indicador de eliminación. Si este byte es un espacio ASCII (0x20) el registro no se borra; si el primer byte es un asterisco (0x2A) el registro es eliminado. Los datos de los campos nombrados en los subregistros de campo van detrás del indicador de eliminación.

Estructura de los subregistros de campo
Desplazamiento de bytes Descripción
0 – 10 Nombre de campo (máximo de 10 caracteres — si hay menos de 10 caracteres, se rellena con caracteres nulo (0x00))
11 Tipo de campo:
C – Character
Y – Currency
N – Numeric
F – Float
D – Date
T – DateTime
B – Double
I – Integer
L – Logical
M – Memo
G – General
C – Character (binario)
M – Memo (binario)
P – Picture
12 – 15 Desplazamiento de campo en el registro
16 Longitud de campo (en bytes)
17 Número de cifras decimales
18 Indicadores de campo
0x01 Columna de sistema (no es visible para el usuario)
0x02 La columna puede almacenar valores NULL
0x04 Columna binaria (sólo para CHAR y MEMO)
19 – 32 Reservado

Para obtener información acerca de limitaciones de número de caracteres por registro, número máximo de campos, etc., consulte Capacidades del sistema de Visual FoxPro.


Bueno, no soy capaz de poner la tabla para que se vea bien, pero la información la he sacado del msdn de microsoft.

Suerte

Isabel_AS 10-04-2007 14:39:32

Resulta que era de Basic 7.1, no de Clipper
 
Tengo varias novedades en mi "problema":

La primera es que he descubierto que la aplicación que generó los ficheros fue hecha en Basic 7.1 para MsDos y no en Clipper como creía.

Los ficheros no tienen ningún tipo de cabecera porque son escritos y leídos directamente por la aplicación origen, con lo que sí que había tomado el camino correcto al intentar leerlos con mi programa y no con otro externo (además, ya he encontrado el criterio de separación de los registros: el primer campo de cada registro es un número que tiene que coincidir con el número de posición dentro del fichero para que el registro sea válido).

Para terminar mi programa ya sólo me queda solucionar la lectura de los datos numéricos, que tiene tela...
He leído que Basic usa el formato MBF de Microsoft para almacenar sus tipos de datos numéricos (los simples, de 4 dígitos y los de doble precisión, que tienen 8) y no el estandar que se usa ahora de IEEE, con lo que necesito saber "leer" en ese formato y transformarlo para Delphi.

Me he bajado de Microsoft la dll MBF2IEEE.DLL que dice que tiene esas funciones de transformación, pero no se incorporarla y usarla desde mi programa.

¿Cómo puedo usar la dll desde mi programa? ¿Este sería el camino correcto?
Gracias.


La franja horaria es GMT +2. Ahora son las 08:14:38.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi