Delphi-PRAXiS
Seite 3 von 5     123 45      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Große Textdateien verarbeiten (https://www.delphipraxis.net/159661-grosse-textdateien-verarbeiten.html)

p80286 7. Apr 2011 14:11

AW: Große Textdateien verarbeiten
 
@DeddyH VST?

Wie wäre es denn mit den Methoden aus der guten alten Dos-Zeit?
Du schleppst eine Kombination aus Dateinamen und "Zeilenzeiger" mit und zeigst nur die 1,2,...n Zeilen an, die auf den Bildschirm passen. Das ist auf jeden Fall speicherschonend, aber etwas aufwendig zu programmieren.

Gruß
K-H

DeddyH 7. Apr 2011 14:31

AW: Große Textdateien verarbeiten
 
Virtual String Tree oder auch Virtual Treeview

-187- 7. Apr 2011 14:37

AW: Große Textdateien verarbeiten
 
Ja tatsächlich Kundenwunsch ... Der Kunde möchte dann durch die zusammengefügte Datei in einer Textbox (Memo) scrollen und ggf. Nacharbeitungen vornehmen.

Jedoch besteht der erste Schritt nur aus dem zusammenfügen der Dateien + Darstellung im Memo.

himitsu 7. Apr 2011 14:44

AW: Große Textdateien verarbeiten
 
Die Datei direkt in einen string laden > natürlich die Ansi-Unicode-Umwandlung nicht vergessen, da die Datei bestimmt mit ANSI gefüllt ist und dein Delphi Unicode nutzt.
(oder in einen AnsiString laden und dann Delphi es umwandeln lassen)

Und dann diesen string direkt an Memo1.Text übergeben.


Dateien zusammenfügen, indem alles Dateien hintereinander in den String geladen werden.


Delphi-Quellcode:
if FileExists(Path) then
begin
  AssignFile(F,Path);
  Reset(F);
  while not eof(F) do
  begin
    Readln(F,tmp);
    Form1.Memo1.Lines.Add(tmp);
  end;
  CloseFile(F);
end;
im Vergleich zu Diesem ... was von dem Folgenden dauert denn wie lange?
Delphi-Quellcode:
if FileExists(Path) then
begin
  AssignFile(F,Path);
  // hier noch den Buffer vergrößen
  Reset(F);
  while not eof(F) do
  begin
    Readln(F,tmp);
    //Form1.Memo1.Lines.Add(tmp);
  end;
  CloseFile(F);
end;
Delphi-Quellcode:
if FileExists(Path) then
begin
  AssignFile(F,Path);
  // hier noch den Buffer vergrößen
  Reset(F);
  tmp := 'hier irgendwas mit der durchschnittlichen Länge einer Zeile reinmachen';
  for i := 1 to Anzahl_der_Zeilen do
  //while not eof(F) do
  //begin
  //  Readln(F,tmp);
    Form1.Memo1.Lines.Add(tmp);
  //end;
  CloseFile(F);
end;

-187- 7. Apr 2011 15:04

AW: Große Textdateien verarbeiten
 
Hm also ich hab jetzt grad schonmal gemessen und bin zu folgendem Ergebnis gekommen:

Code:
file: 20mb, 1372022 Lines
time: 10:34 min
Delphi-Quellcode:
begin
  StartTime:=Time;
  Memo1.Lines.BeginUpdate;
  for i:=1 to Form1.StringGrid1.RowCount do
  begin
    Path:=Form1.StringGrid1.Cells[1,i];
    if FileExists(Path) then
    begin
      AssignFile(F,Path);
      Reset(F);
      while not eof(F) do
        begin
          Readln(F,tmp);
          Form1.Memo1.Lines.Add(tmp);
        end;
      CloseFile(F);
    end;
  end;
  Memo1.Lines.EndUpdate;
  EndTime:=Time;
  ShowMessage('Time: '+TimeToStr(EndTime-StartTime));
end;

Code:
file: 20mb, 1372022 Lines
time: 00:22 min
Delphi-Quellcode:
begin
  StartTime:=Time;
  sl:=TStringList.Create;
  for i:=1 to Form1.StringGrid1.RowCount do
  begin
    Path:=Form1.StringGrid1.Cells[1,i];
    if FileExists(Path) then
    begin
      AssignFile(F,Path);
      Reset(F);
      while not eof(F) do
        begin
          Readln(F,tmp);
          sl.Add(tmp);
        end;
      CloseFile(F);
    end;
  end;
  Memo1.Text:=sl.Text;
  sl.Free;
  EndTime:=Time;
  ShowMessage('Time: '+TimeToStr(EndTime-StartTime));
end;

Deep-Sea 7. Apr 2011 15:09

AW: Große Textdateien verarbeiten
 
Zitat:

Zitat von -187- (Beitrag 1093649)
Der Kunde möchte [...] ggf. Nacharbeitungen vornehmen.

Das klappt dann mit virtuellen Systemen nicht mehr ... oder? *deddyh anschiel*

Wie wäre es also doch in etwa so, wie es p80286 vorgeschlagen hat: Nicht alles auf einmal anzeigen. Diese Forum z.B. zeigt ja auch nicht alle Threads einer Kategorie auf einmal an, sondern stückweise verpackt in übersichtliche Seiten :-D

-187- 7. Apr 2011 15:11

AW: Große Textdateien verarbeiten
 
Ich wollt es erstmal mit einfachen Dingen versuchen :) Vielleicht finden wir ja noch eine akzeptable Lösung :/

alfold 7. Apr 2011 15:12

AW: Große Textdateien verarbeiten
 
Nennt man glaube ich dynamisches lesen und bearbeiten von grossen Textdateien!
(evtl gerade erfunden) :wink:
Der Kunde bekommt davon gar nichts mit!
Er scrollt in den Text so, als währe er komplett im Speicher.
alfold

Deep-Sea 7. Apr 2011 15:13

AW: Große Textdateien verarbeiten
 
@-187-:
1GB auf einmal in 'nen Memo zu laden zählt ganz sicher nicht zu "einfach" :wink:
(Ist ein Memo nicht mal auf 64kB begrenz gewesen?:gruebel:)

-187- 7. Apr 2011 15:14

AW: Große Textdateien verarbeiten
 
Das wäre ziemlich einfach über eine DB (DBGrid) zu lösen ... Wäre eine Überlegung wert.

Edit: Oder TDBMemo :P


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:55 Uhr.
Seite 3 von 5     123 45      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz