 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Warlock Invitado
|
Publicado: Mie 08 Ene, 2003 5:48 pm Asunto: Importar datos a una base de datos |
|
|
Hola:
Mi pregunta es la siguiente. ¿Alguien conoce algún buen método/algoritmo para importar datos desde una archivo de texto plano a una base de datos Interbase? Los campos de los registros en el archivo plano son de ancho fijo, es decir, no están delimitados por ningún caracter.
El mejor método que encontré es usar el componente TIBSQL. Lo que hago es crear un consulta de tipo "INSERT INTO..." e ir modificando en la misma el valor que va dentro de "VALUES(...)". Para eso voy recorriendo el archivo plano y guardando cada registro en un AnsiString. Después con el método SubString del AnsiString voy sacando el valor de los distintos campos y con eso voy formando la consulta. Después, por cada registro llamo al método ExecSQL del TIBSQL. Cuando termino de recorrer todo el archivo salgo del bucle y efectúo un Commit para que se guarden todos los datos en la BD.
El tema es que esto es demasiado lento. El número de campos es 21 por registro y para que se den una idea, para ingresar 3700 registros tardo 7 segundos. Tiene que haber algo mejor, debido a que usando el método BatchInput del TIBSQL el mismo trabajo lo hace en dos segundos. Lo que Uds. se preguntarán es por qué no uso este método. En primer lugar este método sirve para cuando el archivo origen está delimitado por algún caracter (por ejemplo la coma). En segundo lugar porque de acuerdo al valor que voy rescatando de los distintos campos, voy haciendo un prefiltro de acuerdo a ciertos criterios, de tal manera que no todos los registros del archivo se importan a la BD. Usando el método BatchInput esto no es posible porque imnporta todos los registros.
Bueno, si alguien me puede dar una mano se lo voy a agraceder.
Saludos.
Warlock. |
|
| Volver arriba |
|
 |
TOÑO Master

Registrado: 26 Ago 2002Mensajes: 223Ubicación: Madrid - España -
|
Publicado: Vie 10 Ene, 2003 10:44 am Asunto: |
|
|
HOLA:
A simple vista, yo hubiese hecho lo mismo, a no ser que puedas editar directamente, el archivo de texto de donde importas, borrar los datos que no te interesen y hacer las marcas de fin de registro, creo que tratar antes el fichero de importacion seria mas rapido, una vez lo tengas tratado puedes probar ha hacer un gback, o un restore desde el ibconsole.
Si no, pon un progressbar, y un bonito mensaje de espere por favor...
By. |
|
| Volver arriba |
|
 |
Warlock Invitado
|
Publicado: Jue 16 Ene, 2003 1:58 pm Asunto: |
|
|
Toño:
Primero una pregunta. Qué es un gback? Segundo, los datos los tengo que importar a la base mediante la aplicación que estoy desarrollando, no lo puedo hacer desde el ibConsole porque es una cosa que voy a tener que hacer para una posterior búsqueda de registros. Por último, estuve importando los registros enteros mediante el método BatchInput del TIBSql y tarda lo mismo que ejecutando la consulta INSERT registro por registro. |
|
| Volver arriba |
|
 |
TOÑO Master

Registrado: 26 Ago 2002Mensajes: 223Ubicación: Madrid - España -
|
Publicado: Jue 16 Ene, 2003 5:58 pm Asunto: |
|
|
HOLA:
1º GFIX en su modo backup "GFIX BACKUP =GBACK", Perdon por la incorreccion, si no conoces la herramienta gfix, sera mejor que la heches un vistazo, seguramente la utilizaras en el futuro.
2º Depende del volumen de datos a importar, nunca me he visto en la situacion de importar una gran cantidad de datos, pero podrias probar registro a registro, con Cachedupdate = true, (ApplyUpdates para salvar los datos), y miras a ver.
De todas formas voy ha buscar en la red a ver si encuentro algo que te pueda servir.
¿ Importas de Interbase ->Fichero texto ->Interbase ?
si es asi podrias probar
Interbase ->Paradox ->Interbase.
By. |
|
| Volver arriba |
|
 |
Warlock Invitado
|
Publicado: Vie 17 Ene, 2003 4:38 pm Asunto: |
|
|
Toño:
Ante todo muchas gracias. La herramienta GFIX no la conozco, no sé de qué se trata. ¿Es un administrador de base de datos, o algo por el estilo?
También intenté ingresar los registros con CacheUpdate, pero tarda lo mismo. Igualmente, cuando vos decís ingresar registro a registro ¿te referís a ir ejecutando una consulta tipo "INSERT INTO..." por cada registro, no?
Otra cosa, ¿existe la posibilidad que usando el DBE (los controles TTable, TQuery) para un volumen de datos más chico la importación a la base de datos sea más rápida que usando InterBase? ¿Cuándo usas una base de datos de tipo escritorio (como Paradox, Access, DBase), cuál de todas ellas conviene usar?
Bueno Toño, disculpá mi ignorancia, pero recién entoy empezando a programa con Buider, siempre lo hice en Visual Basic. Esta aplicación que estoy haciendo ya la hice en VB, pero no puedo creer que pueda importar los mismos datos en una base de datos Access usando Microsoft Jet en Visual Basic que hacer lo mismo en Builder utilizando un Administrador de Base de datos. ¿Voy a tener acaso que instalarme un tremendo Oracle para una aplicación relativamente chica???? Tené en cuenta que la cantidad de registros promedio que importo cada vez que uso la aplicación es de 5000 (tampoco es tanto como para que sea tan lento). Igual, estoy seguro que tiene que haber un método más rápido porque si vas al Access y ponés importar el mismo trabajo lo hace diez veces más rápido. Lo que pasa que ése es un algoritmo interno de Microsoft.
Bueno, un abrazo y mil gracias.
Warlock. |
|
| Volver arriba |
|
 |
TJOSE Ens

Registrado: 26 Nov 2002Mensajes: 42
|
Publicado: Sab 18 Ene, 2003 3:24 am Asunto: |
|
|
Hola Warlock
Podes importar/exportar archivos txt de estructura fija a/desde interbase o firebird desde el propio motor de la siguiente forma:
Importar:
Hay que crear una tabla en IB
create table Prueba external file 'C:\archivo.txt'(
campo1 char(50),
campo2 char(30),
...
campon char(10),
retorno char(2) /*Esto es para windows o bien retorno char(1) para Unix o Linux*/
Entonces desde la base con cualquier herramienta o programa la ves a la tabla Prueba como una tabla mas de la base, podes hacer select e insert, no update o delete, solo que reside en un archivo externo, despues creas una nueva tabla con la misma extructura y moves los datos de Prueba a la nueva tabla, por ultimo haces drop table Prueba.
Para exportar es similar, solo que si no existe el archivo externo lo crea.
Es probable que me este olvidando de algo. Ahora estoy de vacaciones, pero la semana que viene te puedo mandar todo de forma mas calra si no te funciona este ejemplo.
Saludos
TJOSE |
|
| Volver arriba |
|
 |
TOÑO Master

Registrado: 26 Ago 2002Mensajes: 223Ubicación: Madrid - España -
|
Publicado: Lun 20 Ene, 2003 9:36 am Asunto: |
|
|
HOLA:
Bueno muchas preguntas, interbase se intala con un paquete de programas en ms-dos, entre ellos esta gfix, la mayor utilidad que tiene es cambiar la sincronia de los registros, repara una base de datos dañada, etc.
Lo mas rapido es utilizar los componentes nativos de interbase
TIBi..., ten encuenta que la utilizarlos no pasas por el dbe, y te ahorras una capa.
La opcion de TJOSE puede valerte, asocias una tabla externa a la base de datos, pero luego puedes hacer lo sig.
create table Prueba external file 'C:\archivo.txt'(
campo1 char(50),
campo2 char(30),
********
insert into MiTabla (Codigo,Nombre)
select campo1, campo2 from Prueba // [where] opcional
La velocidad tendra que ser de segundos.
By. |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|