Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   importar registros desde un archivo txt (https://www.clubdelphi.com/foros/showthread.php?t=78980)

mjjj 31-05-2012 15:53:30

importar registros desde un archivo txt
 
1 Archivos Adjunto(s)
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.

Casimiro Notevi 31-05-2012 16:07:00

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.

miguelgalindo87 31-05-2012 18:16:41

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 :D

de antemano gracias .

Casimiro Notevi 31-05-2012 21:00:07

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.

miguelgalindo87 31-05-2012 23:14:25

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 :D

Feliz dia a todos!:D

Casimiro Notevi 31-05-2012 23:59:15

¿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 :)

mjjj 01-06-2012 00:50:25

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

Casimiro Notevi 01-06-2012 01:03:09

Cita:

Empezado por mjjj (Mensaje 434041)
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?... :eek:
O estás más perdido que un submarino en un lavabo... o no me he enterado de lo que quieres hacer :confused:

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...

Casimiro Notevi 01-06-2012 01:22:02

También puedes echar un vistazo a este otro hilo.

novato_erick 15-06-2013 16:39:25

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

novato_erick 19-06-2013 23:35:12

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


La franja horaria es GMT +2. Ahora son las 07:06:22.

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