Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-05-2012
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
importar registros desde un archivo txt

Estimados, necesito importar datos desde un archivo txt a una base de dato Firebird 2.5
El archivo de texto tiene separación entre "campos" con el tabulador, y no se como identificarlo.

El otro tema, es que el proceso de importación puede ser realizado más de una vez, y en tal caso, los registros se repetirán, una solución es realizar una consulta antes de insertar el registro, en caso que no se encuentre se guarda. El problema es que hoy en día el archivo ya tiene casi 30.000 registros, por lo tanto sería 30.000 consultas.

Adjunto parte del archivo.

Espero me puedan ayudar.
Archivos Adjuntos
Tipo de Archivo: txt articulos.txt (762 Bytes, 50 visitas)
Responder Con Cita
  #2  
Antiguo 31-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
El tabulador es el caracter 9, #9, char(9), etc.

Para hacer la importación, si permites repetidos es que ese campo no es un campo clave. Pues eso, hazlo campo clave.
Luego, al importar, si ya existe, te dará error, para evitarlo:

Código Delphi [-]
bucle de importación.
begin
  try
    // tratar los datos y grabar.
    query.post;
  except
    // aquí puedes ir guardando en un memo, por ejemplo, los registros que ya existen y han dado error, para luego mostrarlo al usuario.
  end;
end;

También puedes usar compentes externos para hacer la importación, por ejemplo, este.
Responder Con Cita
  #3  
Antiguo 31-05-2012
miguelgalindo87 miguelgalindo87 is offline
Miembro
NULL
 
Registrado: may 2012
Posts: 22
Poder: 0
miguelgalindo87 Va por buen camino
Hola casimiro, sabes tengo una tabla que quisiera llenar desde un archivo en excel en el que tengo toda la informacion.

La tabla esta hecha en ibexpert con delphi 2.5

si me puedes dar alguna informacion util seria de mucha ayuda

de antemano gracias .
Responder Con Cita
  #4  
Antiguo 31-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Recuerda nuestra guía de estilo, preguntas distintos en hilos distintos.
De todas formas es algo que se ha tratado muchas veces, a ver si lo encuentras.
Avisa si no lo hallas.
Responder Con Cita
  #5  
Antiguo 31-05-2012
miguelgalindo87 miguelgalindo87 is offline
Miembro
NULL
 
Registrado: may 2012
Posts: 22
Poder: 0
miguelgalindo87 Va por buen camino
Ok me rindo lo he intentado y solo encuentro como exportar a excel ...Y en lo que les pedia ayuda era en importar desde excel a una tabla hecha en IBExpert con firebird2.5

Me disculpo tienes razon en lo que dices de los hilos y las preguntas desubicadas jeje sorry todo sea por nuestro bien

Si me pueden ayudar seria muy bueno

Feliz dia a todos!
Responder Con Cita
  #6  
Antiguo 31-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Importar desde excel?, se ha tratado muchas veces, pero si no lo encuentras entonces crea un hilo nuevo.
Como es para importar a firebird, crea el nuevo hilo en el foro "firebird e interbase".
Pon un título descriptivo, algo como: "¿Cómo importar datos de excel a firebird?"
Y explica claramente lo que estás haciendo, lo que necesitas hacer, el problema que tienes, etc.
Ya sabes, sigue nuestra guía de estilo, gracias
Responder Con Cita
  #7  
Antiguo 01-06-2012
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
Por mucho que busco no encuentro nada que utlice IBX, encontre varios ejemplos usando ADO.

Como detecto el char tablatura, y como diferencio las distintos campos el txt, y las guardo en un memo, por ejemplo?

podria ser con la funcion copy ¿?

Gracias
Responder Con Cita
  #8  
Antiguo 01-06-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por mjjj Ver Mensaje
Por mucho que busco no encuentro nada que utlice IBX, encontre varios ejemplos usando ADO.
Como detecto el char tablatura, y como diferencio las distintos campos el txt, y las guardo en un memo, por ejemplo?
podria ser con la funcion copy ¿?
Gracias
Me has confundido por completo, ¿qué es char tablatura?, ¿cómo diferencias campos en el txt?, ¿guardar en un memo?, ¿función copy?...
O estás más perdido que un submarino en un lavabo... o no me he enterado de lo que quieres hacer

Echa un vistazo a esto, por ejemplo.

Tu caso es muy simple, sólo has de leer el fichero de texto línea a línea, por cada línea separas los campos por el tabulador (según has comentado), luego insertar esos datos en la BD y vuelta a empezar con el bucle, así hasta la última línea del fichero de texto.

Veamos si encuentro algún ejemplo...
Responder Con Cita
  #9  
Antiguo 01-06-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
También puedes echar un vistazo a este otro hilo.
Responder Con Cita
  #10  
Antiguo 15-06-2013
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
Hola Chicos tengo casi la misma duda y al final leí las recomendaciones de casimiro sin embargo tengo una pequeña Interrogante:

en realidad mi intensión es que al leer mi archivo TxT con Tabulaciones pueda al final realizar insert en Firebird por Delphi. tengo este codigo que recorre linea por linea es algo lento pero necesito orientación de como hacer el insert usando el componente TQuery del DBExpress..

Este es el procedimiento de recorrido:

Código Delphi [-]
procedure TfrmCargaComprobante.Button2Click(Sender: TObject);
var
  i, j: integer;
  cadena, cadena2: string;
begin
  SetLength(valores, 0);
  for i := 0 to Memo1.Lines.Count - 1 do//169 lineas
  begin
    SetLength(valores, length(valores) + 1);
    cadena := Memo1.Lines[i];
    cadena2 := '';
    for j := 1 to length(cadena) do //Cadena Completa '4'#9'Adames'#9'César'#9'1.71'#9'20.51'#9#9#9
    begin
      if cadena[j] <> ';' then
        cadena2 := cadena2 + cadena[j]// aqui va haciendo el recorriedo poniendo lo siguiente '4'#9'Adames'#9'César'#9'1.71'#9'20.51'#9#9#9 pero cada 
                                      // vez que hace un recorrido esto hace lento el proceso porque a la final mi archivo tiene 169 lineas
      else
      begin
        SetLength(valores[length(valores) - 1],
          length(valores[length(valores) - 1]) + 1);
        valores[length(valores) - 1, length(valores[length(valores) - 1]) - 1]
          := cadena2;
        cadena2 := '';
      end;
    end;
  end;
  ShowMessage('Carga del archivo completada');
end;



Código Delphi [-]
procedure TfrmCargaComprobante.Button4Click(Sender: TObject);
var
rutaTxT, archivotxt : string;
txtFile: TFileStream;
begin
if OpenDialog1.Execute = true then
begin
 txtFile := TFileStream.Create(OpenDialog1.FileName,fmOpenRead or fmShareExclusive);
  archivotxt := txtFile.FileName;
  TxtFile.Destroy;// Destruyo el componente OpenDialog ya que me decía que el archivo estaba siendo usado por otra aplicación con esto lo controle
  Memo1.Lines.LoadFromFile(archivotxt);
end;
end;

Como hago el insert en mi DB De Firebird?


Saludos


novato_erick
Responder Con Cita
  #11  
Antiguo 19-06-2013
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
Hola hace un par de días me encontré con la interrogante de pasar linea por linea a mi base de datos en firebird desde un archivo de texto, bueno en realidad nunca pude con el archivo de texto delimitado por fabulaciones pero si con un CSV delimitado por comas aquí presento cómo lo hice e insertando a la base de datos de firebird.

Código Delphi [-]
procedure TfrmCargaComprobante.btnLecturaClick(Sender: TObject);
var
  i, j, conteo, DiaIncap, HoraIncap, barra, barra2: integer;
  Cadena, cadena2: string;
  campo: TStringList;
  TS: TStrings;
  i2: integer;
  // Variables de cargar Datos
  cod: integer;
  Apellido, Nom: String;
  RxH, sBruto, sSocial, sTotal, sEduc, sNeto, oDesc, hTrabajo: Double;
  // Variable Transaccion
  ExitoComprobante: Boolean;
begin
  ProgressBar1.Min := 0;
  SetLength(valores, 0);
  for i := 0 to Memo1.Lines.Count - 1 do
  begin
    SetLength(valores, length(valores) + 1);
    Cadena := Memo1.Lines[i];
    ProgressBar1.Max := Memo1.Lines.Count - 1;
    begin
      TS := SepararCadena(Cadena, ',');
      try
        for i2 := 0 to TS.Count - 1 do
        begin
          conteo := i2;

          if conteo = 0 THEN
          begin
            cod := strtoint(TS[i2]);
          end;
          if conteo = 1 THEN
          begin
            Apellido := Trim(TS[i2]);
          end;
          if conteo = 2 THEN
          begin
            Nom := Trim(TS[i2]);
          end;
          if conteo = 3 THEN
          begin
            RxH := StrToFloat(TS[i2]);
          end;
          if conteo = 4 THEN
          begin
            sBruto := StrToFloat(TS[i2]);
          end;
          if conteo = 5 THEN
          begin
            sSocial := StrToFloat(TS[i2]);
          end;
          if conteo = 6 THEN
          begin
            sTotal := StrToFloat(TS[i2]);
          end;
          if conteo = 7 THEN
          begin
            sEduc := StrToFloat(TS[i2]);
          end;
          if conteo = 8 THEN
          begin
            sNeto := StrToFloat(TS[i2]);
          end;
          if conteo = 9 THEN
          begin
            oDesc := StrToFloat(TS[i2])
          end;
          if conteo = 10 THEN
          begin
            hTrabajo := StrToFloat(TS[i2])
          end;
          if conteo = 11 THEN
          begin
            DiaIncap := strtoint(TS[i2])
          end;
          if conteo = 12 THEN
          begin
            HoraIncap := strtoint(TS[i2])
          end;
        end;
      finally
        begin
          ExitoComprobante := False;
          trnComprobante := dmConectar.Conectar.BeginTransaction;
          Try
            With dmlogicaPlanilla.qInsertaComprobantes do
            begin
              Close;
              parambyname('Tarjeta').AsInteger := cod;
              parambyname('Apellido').AsString := Trim(Apellido);
              parambyname('Nombre').AsString := Trim(Nom);
              parambyname('RataporHora').AsFloat := RxH;
              parambyname('SalarioBruto').AsFloat := sBruto;
              parambyname('SeguroSocial').AsFloat := sSocial;
              parambyname('TotalSeguros').AsFloat := sTotal;
              parambyname('SeguroEducativo').AsFloat := sEduc;
              parambyname('SalarioNeto').AsFloat := sNeto;
              parambyname('OtrosDescuentos').AsFloat := oDesc;
              parambyname('FechaInicio').AsDate := dtpInicio.Date;
              parambyname('FechaFinal').AsDate := dtpFinal.Date;
              parambyname('HorasTrabajo').AsFloat := hTrabajo;
              parambyname('DiasIncap').AsInteger := DiaIncap;
              parambyname('HorasIncap').AsInteger := HoraIncap;
              parambyname('Cedula').AsString := '0-000-000';
              execsql;
              begin
                dmConectar.Conectar.CommitFreeAndNil(trnComprobante);
                ExitoComprobante := true;
              end;
              barra := Memo1.Lines.Count;
              barra2 := barra - 1;
              ProgressBar1.Position := barra2;
            end;
          except
            on e: exception do
            begin
              dmConectar.Conectar.RollbackFreeAndNil(trnComprobante);
              ShowMessage('Error Encontrado' + e.Message);
            end;
            // Close;

          end;
          cod := 0;
          Apellido := '';
          Nom := '';
          RxH := 0.00;
          sBruto := 0.00;
          sSocial := 0.00;
          sTotal := 0.00;
          sEduc := 0.00;
          sNeto := 0.00;
          oDesc := 0.00;
          hTrabajo := 0.00;
          DiaIncap := 0;
          HoraIncap := 0;
          TS.Free;
        end;

      end;
    end;
    // campo := TStringList.Create;
  end;
  ShowMessage('Carga del archivo completada');
  if Application.MessageBox('¿Desea Imprimir Comprobantes de Pago?',
    'Confirmación', MB_ICONQUESTION OR MB_YESNO) = ID_NO then
  begin
    frmCargaComprobante.Close;
  end
  else // si no cerramos limpiamos nuestros componentes y variables del form
  begin
    dmlogicaPlanilla.qConsultaComprobante.Open;
    dmlogicaPlanilla.frxSobres.ShowReport(true);
    frmCargaComprobante.Close;
  end;
end;

lo más seguro que habrá una manera más rápida de hacerlo y creo que con un CASE se mejoraría y la rutina no repetiría varias veces pero ese es otro tema de investigación e implementación.

Saludos

novato_erick
Responder Con Cita
Respuesta



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
importar registros de tablas juliet DB2 1 14-12-2006 16:19:34
Importar datos a access desde un archivo delimitado por comas luis juarez Conexión con bases de datos 1 10-05-2006 22:46:13
Importar a SQL desde Archivo de Texto erasmorc MS SQL Server 8 03-06-2005 20:39:04
como importar claves al Registro (desde archivo.reg) sitrico Varios 1 03-12-2004 17:34:26
Script para importar desde un archivo csv Leonardo Firebird e Interbase 1 24-08-2004 22:23:47


La franja horaria es GMT +2. Ahora son las 12:43:59.


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