Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Text-Dateien hintereinander auslesen (https://www.delphipraxis.net/85964-text-dateien-hintereinander-auslesen.html)

moperswings 7. Feb 2007 08:14


Text-Dateien hintereinander auslesen
 
Hallo,

ich habe drei Textdateien, deren Zeilen ich zähle. Jetzt brauche ich aber die Gesamtsumme aller Zeilen.
Meine Frage:
Wie läuft das mit der Rechenperformance?
Kann bzw. sollte ich mit ruhigem Gewissen auf Knopfdruck drei Dateien hintereinanderer öffnen, auslesen, schliessen und die Ergebnisse den Labels zuweisen und darauf vertrauen, das die heutigen Rechner das schaffen und mir mein Programm nicht abstürzt?
Gibt es eine kb-Grenze pro Datei, die ich bei solchen Aktionen nicht überschreiten sollte?

Hoffe auf Eure Erfahrungen,

Viele Grüsse, moperswings

oki 7. Feb 2007 08:29

Re: Text-Dateien hintereinander auslesen
 
Moin,

eine Grenze gibt es mines Wissens nicht. Grundsätzlich ist das mit der Performance jedoch relativ. Öffne doch einfach eine Datei, ermittel die Zeilen, schließe sie wieder und nehm dir die nächste vor. das passtr alles gut in eine Schleife. Ich gehe jetzt mal davon aus, dass du Textdateien meinst (wegen Zeilen). Wenn ich zeilenweise auf Textdateien zugreifen will benutze ich immer TStringList. Ob das nun schnell ist war bei der Größe von Dateien bei mir bis jetzt nicht so relevant. Es lässt sich aber einfach händeln.

Funzen würde das so, Stringlist creieren. In Schleife LoadfromFile aufrufen, Count ermitteln und merken, Clear, nächstes File. Das bis alle abgearbeitet sind und dann Stringliste frei geben.

Gruß oki

smudo 7. Feb 2007 09:12

Re: Text-Dateien hintereinander auslesen
 
Da die Frage nach der Performance war, würde ich nicht die komfortable Methode mit den Stringlisten, sondern den ersteren Vorschlag von oki verwenden.

Edit: Ich musste letztens mit einem SQL-Skript mit 2,5 Mio Zeilen arbeiten, da ist die Stringliste mit Out Of Memory ausgestiegen. Das direkte verwenden der Datei hat problemlos funktioniert.

Klaus01 7. Feb 2007 09:19

Re: Text-Dateien hintereinander auslesen
 
Vielleicht auch so:

Delphi-Quellcode:
var
  dataFile: TextFile;
  line : String;
  i: Byte;
  LineCount: Int64;

begin
  LineCount := 0;
  for i:=0 to FileNames.count -1 do
    begin
      assignFile(dataFile,FileNames[i]);
      reset(dataFile);
         while not eof(dataFile) do
           begin
             readln(dataFile,line);
             inc(LineCount);
           end;
      CloseFile(dataFile);
    end;
  end;
  ShowMessage('Zeilenzahl: 'Int64ToStr(LineCount));
end;
- benötigt kaum Speicher

Grüße
Klaus

moperswings 7. Feb 2007 13:49

Re: Text-Dateien hintereinander auslesen
 
Ich habe es in etwa mit dem Code probiert, den Klaus vorgeschlagen hat - nur dass ich halt alle drei Datensätzen hintereinander öffne, auslese und schliesse.
Läuft alles ohne Probleme!
Es gibt aber wahrscheinlich auch elegantere Wege als meinen, um das Problem zu lösen!

Vielen Dank und viele Grüsse, moperswings

AirJordan 9. Feb 2007 13:38

Re: Text-Dateien hintereinander auslesen
 
Zitat:

Zitat von oki

Funzen würde das so, Stringlist creieren. In Schleife LoadfromFile aufrufen, Count ermitteln und merken, Clear, nächstes File. Das bis alle abgearbeitet sind und dann Stringliste frei geben.

Eine Frage zum LoadFromFile. Ich habe ein ähnliches Problem:

Wenn ich mehrere Dateien, die nur Text enthalten, in einer Schleife in einer! StringList
zusammen führen möchte, hängt dann das LoadFromFile die Daten nacheinander in die Liste
oder wird das StringList mit jeder neuen Datei wieder auf null zurück gesetzt?? :gruebel:

Klaus01 9. Feb 2007 13:40

Re: Text-Dateien hintereinander auslesen
 
Aus der Hilfe:

Zitat:

procedure LoadFromFile(const FileName: string); virtual;

Description

Call LoadFromFile to fill the list of the TStrings object from the file specified by FileName. Each line in the file, as indicated by carriage return or linefeed characters, is appended as a string in the list.

Note: LoadFromFile uses the Add method to add the strings that are read from the file.
Grüße
Klaus

Gruber_Hans_12345 9. Feb 2007 13:44

Re: Text-Dateien hintereinander auslesen
 
... also ich dachte, der leert den TStrings immer vorm einlesen? ... mal nachschaun ...

AirJordan 9. Feb 2007 13:46

Re: Text-Dateien hintereinander auslesen
 
Ich vermute auch das es die Liste vorher leert. Hatte gestern Abend nämlich das
Problem, das immer nur die letzte Datei in die StringList eingelesen wurde....

Ansonsten danke Klaus :thumb: Werde das noch mal Zuhause checken.

AirJordan 9. Feb 2007 18:38

Re: Text-Dateien hintereinander auslesen
 
Zitat:

Zitat von Gruber_Hans_12345
... also ich dachte, der leert den TStrings immer vorm einlesen? ... mal nachschaun ...

Also LoadFromStream und LoadFromFile leeren die TStrings vorher. Da muss ich mir dann etwas anderes einfallen lassen.

oki 9. Feb 2007 20:00

Re: Text-Dateien hintereinander auslesen
 
Nimm eine StringList zusätzlich (TempStringList) in die du immer den Text lädst und addiere nach dem Laden den Text an deine eigentliche Liste

Delphi-Quellcode:
  MyStringList.Text := MyStringList.Text + TempStringList.Text;
Das ist sicher nicht die eleganteste Lösung, aber es wird sicher funzen.

Gruß oki

Hawkeye219 9. Feb 2007 20:40

Re: Text-Dateien hintereinander auslesen
 
Zitat:

Zitat von oki
Das ist sicher nicht die eleganteste Lösung, aber es wird sicher funzen.

Richtig, etwas eleganter wäre zum Beispiel die Verwendung von Delphi-Referenz durchsuchenTStrings.AddStrings.

Gruß Hawkeye

AirJordan 9. Feb 2007 21:11

Re: Text-Dateien hintereinander auslesen
 
Zitat:

Zitat von Hawkeye219
Richtig, etwas eleganter wäre zum Beispiel die Verwendung von Delphi-Referenz durchsuchenTStrings.AddStrings.

Stimmt, genau die habe ich jetzt auch eingesetzt! :thumb: Danke für die Tipps!


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:26 Uhr.

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