FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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. |
#2
|
|||
|
|||
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. |
#3
|
||||
|
||||
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 - |
#4
|
|||
|
|||
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!! |
#5
|
||||
|
||||
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|| |
#6
|
|||
|
|||
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'. |
#7
|
|||
|
|||
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? |
#8
|
||||
|
||||
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 FoxBASE1 – 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 estructural29 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 – Character12 – 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)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 - |
#9
|
|||
|
|||
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. |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
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 |
|