Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zeilen in einer Datei zählen (https://www.delphipraxis.net/69790-zeilen-einer-datei-zaehlen.html)

happyaura 19. Mai 2006 23:06


Zeilen in einer Datei zählen
 
Hallo,
gibt es eine einfache möglichkeit, rauszubekommen, wieviele zeilen eine datei hat? Es handelt sich dabei um recht kurze zeilen, aber bis ca 65000 stück.

MFG Martin

Hawkeye219 19. Mai 2006 23:09

Re: Zeilen in einer Datei zählen
 
Hallo Martin,

am einfachsten dürfte es sein, die Datei in eine TStringList zu laden und deren Eigenschaft Count abzufragen.

Gruß Hawkeye

himitsu 19. Mai 2006 23:18

Re: Zeilen in einer Datei zählen
 
Oder so:
Delphi-Quellcode:
Var F: TextFile;
  Count: Integer;

Count := 0;
AssignFile(F, ...);
FileMode := fmOpenRead;
Reset(F);
While not EoF(F) do Begin
  ReadLn(F);
  Inc(Count);
End;
CloseFile(F);

Hansa 19. Mai 2006 23:52

Re: Zeilen in einer Datei zählen
 
Noch eine Möglichkeit : Dateigröße durch Länge der Zeilen teilen. Geht allerdings nur richtig, sofern alle Zeilen gleich lang sind !

happyaura 20. Mai 2006 00:04

Re: Zeilen in einer Datei zählen
 
Vielen Dank für die Antworten.
zeilen sind nicht exakt gleich lang, können um 1-2 zeichen vareieren. ich hab mich jetzt für die TStringlist entschieden, hab aber noch 'ne frage, ob ich so speicher verliere:

Delphi-Quellcode:
fileData := TStringList.Create;    
  for i := 1 to 8 do
  begin
    IF FileExists(filename[i]) then
    begin
      fileData.LoadFromFile(filename[i]);
      count[i]:=filedata.Count;
    end
    else
      count[i]:=0;
  end;
  filedata.Destroy;
die stinglist wird so ja 8 mal mit werten gefüllt. aber was passiert mit dem allokierten speicher der vorhergehenden einträge?
Gruß Martin

Hawkeye219 20. Mai 2006 00:10

Re: Zeilen in einer Datei zählen
 
Der Speicher sollte beim erneuten Füllen wieder freigegeben werden.

PS: Schon mal die Online-Hilfe zu Delphi-Referenz durchsuchenTObject.Destroy gelesen?

Gruß Hawkeye

Hansa 20. Mai 2006 00:20

Re: Zeilen in einer Datei zählen
 
Was ist mit himitsus Vorschlag ? Würde mich mal interessieren, was die Stringliste interessanter macht. Wenn die Zeilen nicht gleich lang sind, ist das der einfachste Vorschlag zum Ziel zu kommen. Und das ohne Create und Delete und Speicher. 8) Es gibt Error oder eben nicht, zumindest aber kein sich langsam aufbauendes Speicherleck.

himitsu 20. Mai 2006 00:27

Re: Zeilen in einer Datei zählen
 
Zitat:

Zitat von Hansa
Was ist mit himitsus Vorschlag.

meines ist eventuell nicht so schnell (kommt drauf an wieviele Zeilen es gibt und wie groß die Datei ist), aber es gibt garantiert kein Speicherleck und der Speicherverbrauch ist auch total gering (460 Byte bis maximal Zeilenlänge), da ja nicht die ganze Datei im Speicher landet

Hansa 20. Mai 2006 01:02

Re: Zeilen in einer Datei zählen
 
Himitsu, was redest Du da ? Ich meine das :
Zitat:

Zitat von himitsu
..(kommt drauf an wieviele Zeilen es gibt und wie groß die Datei ist)

:shock: Ein Reset weist eigentlich nur dem logischen (Programm)File eine Datei zum öffne zu. Dann werden soviele Bytes gelesen, wie die Zeile tatsächlich lang ist. Natürlich immer wieder bis EOF. Große Datei -> dauert länger, als bei kleiner Datei, weil eben mehr Zeilen. Aber ich mülle mir wegen Fehler nicht den Speicher zu ! Im Fehlerfall wegen vergessener Speicher-Freigabe, die manuell gemacht werden muß, wird das Programm sogar immer langsamer ! Der Effekt dürfte bei 60.000 Zeilen allerdings nicht mal zu bemerken sein bei neuem Rechner, der mit 3.000.000.000 mal taktet pro Sek. und das bei 200.000.000.000 Zeichen als Festplattenspeicher. Man muß die Zahlen echt mal aufschreiben und in Bezug setzen zu 60.000 Zeilen mit < 1000 Zeichen ! Da an der Stelle was an Zeit sparen zu wollen, das ist ähnlicher Unfug, wie wegen 300 kB mit nonVCL anzufangen. Sorry, Luckie. :mrgreen:

himitsu 20. Mai 2006 02:44

Re: Zeilen in einer Datei zählen
 
Also, selbst wenn bei TextFile ein Fehler auftreten sollte dann ist wäre das Speicherleck jedenfalls geringer, als wenn was bei der StringList passiert (nach den obrigen Codes)

Aber man kann ja auch nochmehr an Code einsparren und die ganzen I/O-Checks weglassen
Delphi-Quellcode:
Var F: TextFile;
  Count: Integer;

Count := 0;
AssignFile(F, ...);
FileMode := fmOpenRead;
{$I-}
Reset(F);
While not EoF(F) do Begin
  ReadLn(F);
  Inc(Count);
End;
CloseFile(F);
{$I+}
If IOResult <> 0 Then Count := -1;

// Count >= 0     Count = Zeilenanzahl
// Count = -1     Fehler

Aber hast du dir mal angesehn, was TStringList.LoadFromFile macht?
Das erstellt erstmal 'nen FileStream
kopiert den Inhalt der Datei in einen String
zerlegt den großen String in kleine Strings
und fügt diese kleinen Strings in die StringListe ein ... und zwar jeden einzeln (was intern auch wieder einiges an rumcopieren verursacht)
und gibt zum schluß wieder die beiden Strings und den FileStream frei (man hat also zeitweise über das Doppelte der Dateigröße im RAM und wenn die Datei aus nur einem String besteht sogar as Dreifache
...
tja und zum Schluß muß auch alles wieder freigegeben werden


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:48 Uhr.
Seite 1 von 2  1 2      

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