Ver Mensaje Individual
  #16  
Antiguo 07-02-2013
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Reputación: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
He estado jugando un poco con el código y he creado esta función, que creo que hace lo que tu necesitas, pero no lo va pasando de Memo en Memo...
La única interacción que tiene con el formulario es el Label que cuenta las líneas. Si quitas eso y el Application.ProcessMessages será mucho más rápido.

He creado un botón llamado ButtonAgrupar y le he puesto el código.

No utiliza StringGrids, que son visuales, por lo que no utiliza tanta memoria. De todos modos carga el texto en un TStringList.
Es fácilmete modificable para no utilizar nada de memoria, abriendo el archivo origen y escribiendo en el archivo destino mediante Readln(F, s); y Writeln(F, s);

Espero que te sirva.

Código Delphi [-]
procedure TForm1.ButtonAgruparClick(Sender: TObject);
var
   s1, s2 : TStringList;
   archivo: string;
   monto, nombre, autoriz, fecha : string;
   i : Integer;
   cant : Integer;
   conv : Double;
   ruta : string;
   dia  : Word;
   mes  : Word;
   ano  : Word;
   hor  : Word;
   min  : Word;
   sec  : Word;
   mil  : Word;
   romp : string;
   total: Real;
begin
   // inicializo variables
   detener := 'N';
   autoriz :='';
   nombre := '';
   fecha :='';
   total := 0;
   cant := 0;

   // Creo StringLists para trabajar con los textos
   s1 := TStringList.Create;
   s2 := TStringList.Create;
   try
      // Pido datos origen
      OpenDialog1.Execute;
      archivo := OpenDialog1.FileName;

      // Cargar archivo de texto
      s1.LoadFromFile(archivo);

      // Obtengo el nombre del fichero destino
      DecodeDate(Now,ano,mes,Dia);
      DecodeTime(Now,hor,min,sec,mil);
      ruta := OpenDialog1.InitialDir +'Universal_'+inttostr(Dia)+inttostr(mes)+inttostr(ano)+'_'+inttostr(hor)+inttostr(min)+inttostr(sec  )+'.txt';

      // Inicializo romp con el valor de la primera linea
      romp := Trim(Copy(s1[0], 35, 15)); // Rompe por AUTORIZACION

      // Recorro todo el archivo
      for i := 0 to (s1.Count-1) do
      begin
         monto := Trim(Copy(s1[i], 71, 14));   // MONTO
         nombre := Trim(Copy(s1[i], 85, 80));  // NOMBRE
         autoriz := Trim(Copy(s1[i], 35, 15)); // AUTORIZACION
         fecha := Trim(Copy(s1[i], 10,  8));   // FECHA AUTORIZACION

         // Datos completos no error de separacion de lineas
         If (monto <> '') and (nombre <> '') and (autoriz <> '') then
         begin
            // Colocar punto al monto
            conv := (StrToFloat(monto)*0.01);
            monto := FloatToStr(conv);

            // Si la autorizacion no es vacia
            If Trim(autoriz) <> '' then
            begin
               // Si cambio el campo autorizacion, creo un registro e inicializo total
               If Trim(autoriz) <> Trim(romp) then
               begin
                  nombre := fecha + #9 + nombre + #9 + '0000000' + #9 + '0000000' + #9 + '0000000' + #9 + autoriz + #9 + FloatToStr(total) + #9 + FloatToStr(total);
                  s2.Add(nombre);

                  total := 0;
                  romp  := Trim(autoriz);
               end;
            end;

            // Acumulo monto
            total := total + StrToFloat(monto);

            // Cuento lineas tratadas
            cant := cant + 1;
            Label2.Caption := IntToStr(cant);
            Application.ProcessMessages;
         end;

         If Detener = 'S' then Break;
      end;

      // Terminé de recorrer pero todavía tengo un ultimo total
      If (total > 0) then
      begin
         nombre := fecha + #9 + nombre + #9 + '0000000' + #9 + '0000000' + #9 + '0000000' + #9 + autoriz + #9 + FloatToStr(total) + #9 + FloatToStr(total);
         s2.Add(nombre);
      end;

      // Guardo las lineas agrupadas
      s2.SaveToFile(ruta);
   finally
      // Libero StringGrids
      s1.Free;
      s2.Free;
   end;

   // Termino aplicacion
   Application.Terminate;
end;
Responder Con Cita