Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Fichero de Texto Enorme (https://www.clubdelphi.com/foros/showthread.php?t=53125)

muli 11-02-2008 20:35:34

Fichero de Texto Enorme
 
Estoy tratando de manejar ficheros de texto que son enormes (50 mb), ya os imaginais cuantos registros puede traer, el problema es que antes lo tengo que manipular con el Ultra Edit y asignarle 200 caracteres por linea por ejemplo y luego lo manipulo desde delphi, conoceis alguna forma de tratarlo sin necesidad de cortarlo antes con el ultra edit, algun componente que me lo trate con rapidez.

Gracias.

Saludos.

jachguate 11-02-2008 21:30:15

Podes abrirlo directamente con TStringList o con archivos de texto clásicos (de los que ya existían desde turbo pascal) sin necesidad de pasarlo por nada antes.

Un saludo.

;)

cHackAll 11-02-2008 22:44:47

estoy de acuerdo con lo que dice jachguate; sin embargo dicho objeto o cualquier componente que vayas a utilizar va a acceder a las APIs que acceden al sistema de archivos; si nos das una idea del proceso que llevas con dichos archivos çde texto talvez podríamos guiarte con algo de código.

Siendo una solucion mas efectiva, tambien es más costosa en conocimientos y en tiempo.

Saludos

muli 14-02-2008 18:14:40

El tema es el siguiente:
Fichero de texto enorme incluso tengo uno de 250 mb.
Tiene una sola linea
Con el UltraEdit lo parto a 1000 caracteres por linea.
Luego desde Delphi abro el fichero y voy copiando linea a linea para una BD según la posición que ocupe.

Gracias.

Saludos.

jachguate 14-02-2008 18:37:06

Pues lo que digo es que no hace falta abrir el archivo con ultraedit para partirlo. Podrías hacerlo directamente con delphi.

Si tiene 250Mb. sin saltos de línea, no creo que eso pueda manejarse en un solo string... según recuerdo el límite es de 64Kb. de texto en un solo string.

Pero si podes abrirlo como un stream... e ir cargandolo en los bloques que te parezca conveniente en un buffer.

Si procesas estos archivos con frecuencia, el tiempo que invirtás en programarlo se pagará solo al simplificar el proceso metiendo directamente el archivo al programa.

Un saludo.

;)

muli 16-02-2008 02:01:05

Te refieres a cargarlo en un componente Memo, RichEdit, etc, y luego cortarlo como yo quiera. El tema es que lo he cargado en un Memo y tambien en un RichEdit, pero ahora estoy parado no se como cortarlo por ejemplo a 100 caracteres por linea.

Gracias.

Saludos.

cHackAll 18-02-2008 01:16:07

Cita:

Empezado por muli (Mensaje 266298)
Te refieres a cargarlo en un componente Memo, RichEdit, etc, y luego cortarlo como yo quiera. El tema es que lo he cargado en un Memo y tambien en un RichEdit, pero ahora estoy parado no se como cortarlo por ejemplo a 100 caracteres por linea.

Gracias.

Saludos.

Espero no salirme por la tangente pero se me ocurre;

Código Delphi [-]
var Buffer: array [0..666] of Char;
procedure TForm1.ButtonClick(Sender: TObject);
var hFile, Size: Integer;
begin
 hFile := _lopen('archivo.txt', OF_READ);
 if hFile = -1 then Exit; // Error de apertura
 repeat Size := _lread(hFile, @Buffer, SizeOf(Buffer) - 1); // Leemos cada N caracteres
  Buffer[Size] := #0;
  if LongBool(Size) then 
   mysql_query(Handle, PChar('insert into noseque values ('+#39+@Buffer+#39+')')); // Por ejemplo.
 until Size < (SizeOf(Buffer) - 1);
 CloseHandle(hFile);
end;

Espero no hayan muchos errores pues no tenga el Delphi a la mano; pero la idea es leer cada cierta cantidad de bytes del archivo e ir insertandolos a la BD

Suerte.

muli 19-02-2008 02:05:15

Supongo que el array [0..666] son los caracteres a los que quiero cortar.

Lo he probado del siguiente modo:

Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
Var hFile, Size: Integer;
    Buffer : Array [0..200] Of Char;

begin
 If OpenDialog1.Execute Then
 Begin
   hFile := _lopen(PChar(OpenDialog1.FileName), OF_READ);
   if hFile = -1 then Exit; // Error de apertura
   repeat Size := _lread(hFile, @Buffer, SizeOf(Buffer) - 1); 
    Buffer[Size] := #0;
    if LongBool(Size) then
    Memo2.Lines.Add(PChar(@Buffer)); // Por ejemplo.
 until Size < (SizeOf(Buffer) - 1);
 CloseHandle(hFile);
 end;
End;

Y Cortando a 120 caracteres el fichero correspondiente, lo hace perfectamente, pero el de 200 me cae en bucle, y no se por que.

cHackAll 19-02-2008 02:23:35

Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var hFile, Size, Count: Integer;  Buffer : Array [0..200] Of Char;
begin
 if OpenDialog1.Execute Then
  begin
   hFile := _lopen(PChar(OpenDialog1.FileName), OF_READ);
   if hFile = -1 then Exit;
   Size := GetFileSize(hFile, nil);
   while LongBool(Size) do
    begin
     Count := SizeOf(Buffer) - 1;
     if Size < Count then Count := Size;
     Dec(Size, _lread(hFile, @Buffer, Count));
     Buffer[Count] := #0;
     Memo2.Lines.Add(PChar(@Buffer));
    end;
  CloseHandle(hFile);
 end;
end;


La franja horaria es GMT +2. Ahora son las 13:28:41.

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