Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-03-2007
Isabel_AS Isabel_AS is offline
Registrado
 
Registrado: ene 2007
Posts: 9
Poder: 0
Isabel_AS Va por buen camino
Question 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.
Responder Con Cita
  #2  
Antiguo 29-03-2007
afxe afxe is offline
Miembro
 
Registrado: jul 2004
Ubicación: Malaga-España
Posts: 273
Poder: 20
afxe Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 30-03-2007
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.409
Poder: 22
fjcg02 Va camino a la fama
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
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #4  
Antiguo 30-03-2007
Isabel_AS Isabel_AS is offline
Registrado
 
Registrado: ene 2007
Posts: 9
Poder: 0
Isabel_AS Va por buen camino
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!!
Responder Con Cita
  #5  
Antiguo 30-03-2007
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
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.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #6  
Antiguo 02-04-2007
Isabel_AS Isabel_AS is offline
Registrado
 
Registrado: ene 2007
Posts: 9
Poder: 0
Isabel_AS Va por buen camino
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'.
Responder Con Cita
  #7  
Antiguo 03-04-2007
Isabel_AS Isabel_AS is offline
Registrado
 
Registrado: ene 2007
Posts: 9
Poder: 0
Isabel_AS Va por buen camino
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?
Responder Con Cita
  #8  
Antiguo 04-04-2007
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.409
Poder: 22
fjcg02 Va camino a la fama
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
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #9  
Antiguo 10-04-2007
Isabel_AS Isabel_AS is offline
Registrado
 
Registrado: ene 2007
Posts: 9
Poder: 0
Isabel_AS Va por buen camino
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.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Obtener un fichero adjunto a un nodo de un fichero XML muntasil Internet 0 18-07-2006 12:57:57
Delphi V.S. Clipper AGAG4 Varios 7 01-08-2005 21:39:31
Clipper en 3 Capas ???? AGAG4 Providers 3 30-06-2005 19:03:17
Analogia con Clipper JorgeBec Varios 4 12-06-2004 02:01:55
De clipper a Delphi... JorgeBec Varios 15 22-04-2004 23:05:19


La franja horaria es GMT +2. Ahora son las 04:58:05.


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
Copyright 1996-2007 Club Delphi