AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zeilen in einer Datei zählen

Ein Thema von happyaura · begonnen am 19. Mai 2006 · letzter Beitrag vom 20. Mai 2006
Antwort Antwort
Seite 1 von 2  1 2      
happyaura

Registriert seit: 12. Jan 2005
Ort: Hamburg
73 Beiträge
 
Delphi 6 Personal
 
#1

Zeilen in einer Datei zählen

  Alt 19. Mai 2006, 23:06
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
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Zeilen in einer Datei zählen

  Alt 19. Mai 2006, 23:09
Hallo Martin,

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

Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#3

Re: Zeilen in einer Datei zählen

  Alt 19. Mai 2006, 23:18
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);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#4

Re: Zeilen in einer Datei zählen

  Alt 19. Mai 2006, 23:52
Noch eine Möglichkeit : Dateigröße durch Länge der Zeilen teilen. Geht allerdings nur richtig, sofern alle Zeilen gleich lang sind !
Gruß
Hansa
  Mit Zitat antworten Zitat
happyaura

Registriert seit: 12. Jan 2005
Ort: Hamburg
73 Beiträge
 
Delphi 6 Personal
 
#5

Re: Zeilen in einer Datei zählen

  Alt 20. Mai 2006, 00:04
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
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Zeilen in einer Datei zählen

  Alt 20. Mai 2006, 00:10
Der Speicher sollte beim erneuten Füllen wieder freigegeben werden.

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

Gruß Hawkeye
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#7

Re: Zeilen in einer Datei zählen

  Alt 20. Mai 2006, 00:20
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#8

Re: Zeilen in einer Datei zählen

  Alt 20. Mai 2006, 00:27
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#9

Re: Zeilen in einer Datei zählen

  Alt 20. Mai 2006, 01:02
Himitsu, was redest Du da ? Ich meine das :
Zitat von himitsu:
..(kommt drauf an wieviele Zeilen es gibt und wie groß die Datei ist)
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#10

Re: Zeilen in einer Datei zählen

  Alt 20. Mai 2006, 02:44
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:22 Uhr.
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