Autor |
Beitrag |
der organist
      
Beiträge: 467
Erhaltene Danke: 17
WIN 7
NQC, Basic, Delphi 2010
|
Verfasst: Mo 22.12.08 13:02
Hi Leutz,
wie bekomme ich die Zeilenanzahl einer TextFile heraus, ohne sie in iergendeine Komponente zu laden?
Thx, MfG Moderiert von Christian S.: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mo 22.12.2008 um 12:04
_________________ »Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
|
|
chrisw
      
Beiträge: 439
Erhaltene Danke: 3
W2K
D7
|
Verfasst: Mo 22.12.08 13:22
Ich würde die Datei laden, zeilenweise lesen, Zähler hochzählen.
ala:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| function ZaehleZeilen(filename: String) : Integer; var F : TextFile; S : String; begin AssignFile(F,filename); Reset(F); Result := 0; while not Eof(F) do begin ReadLn(F,S); inc(Result); end; CloseFile(F); end; |
_________________ Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 22.12.08 13:31
Oder mit einer TStringlist:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| function ZaehleZeilen(const Filename: String) : Integer; var sl: TStringlist; begin if not FileExists(Filename) then Result := -1 else begin sl := TStringlist.Create; try sl.LoadFromFile(Filename); Result := sl.Count; finally sl.Free; end; end; end; |
|
|
chrisw
      
Beiträge: 439
Erhaltene Danke: 3
W2K
D7
|
Verfasst: Mo 22.12.08 13:33
Ja, wobei man sich hier streiten kann, ob TStringList eine Komponente ist.
_________________ Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 22.12.08 13:35
Klasse ja, Komponente nein.
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Mo 22.12.08 13:50
Via Blockread/Blockwrite - geht am schnellsten und dann nur #10#13 zählen.
TStringList verbraucht Speicher und ist nicht sooo performant.
:-)Msch
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 22.12.08 14:00
Das ist zweifellos richtig, aber dann sollte man auch Fehlerfälle behandeln.
|
|
der organist 
      
Beiträge: 467
Erhaltene Danke: 17
WIN 7
NQC, Basic, Delphi 2010
|
Verfasst: Mo 22.12.08 17:04
gibts da keine andere Möglichkeit??
_________________ »Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
|
|
der organist 
      
Beiträge: 467
Erhaltene Danke: 17
WIN 7
NQC, Basic, Delphi 2010
|
Verfasst: Mo 22.12.08 17:09
erst mal, am einfachsten finde ich die Lösung von chrisw. Danke dafür.
Danke auch an alle anderen, die sich hier die Mühe gegeben haben.
_________________ »Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
|
|
Blackheart666
      
Beiträge: 2195
XP
D3Prof, D6Pers.
|
Verfasst: Mo 22.12.08 17:50
der organist hat folgendes geschrieben : | erst mal, am einfachsten finde ich die Lösung von chrisw. Danke dafür.
Danke auch an alle anderen, die sich hier die Mühe gegeben haben. |
Obwohl doch die bessere und wohl auch einfachere Variante die von DeddyH ist.
_________________ Blackheart666
Der Irrsinn ist bei Einzelnen etwas Seltenes, - aber bei Gruppen, Parteien, Völkern, Zeiten die Regel. (Friedrich Nietzsche)
|
|
delphi10
      
Beiträge: 447
Erhaltene Danke: 2
W2K, XP, Vista64, Win7 64
RAD-Studio 2010
|
Verfasst: Mo 22.12.08 18:01
Mal angenommen, man hätte ein konstante Zeilenbreite von 100 Zeichen, dann ginge es auch so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| Var F : File; const Zeilenbreite : Integer = 100; . . AssignFile(F,'Name'); Reset(f,Zeilenbreite); x := FileSize(F); CloseFile(F); |
X gibt die Anzahl der Datensätze in der Datei F an. Durch Reset(f,100), wird ein Datensatz auf 100 Zeichen festgelegt.
Ja, zugegeben. Konstante Zeilenbreite kommt wohl eher selten vor. Aber schnell ist es..!
cu Delphi10
_________________ Salus populi suprema lex esto
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 22.12.08 18:51
Um das einmal zu komplettieren (speicherschonende Variante mit Fehlerbehandlung):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| function ZaehleZeilen(const filename: String) : Integer; var F : TextFile; begin Result := -1; if FileExists(filename) then begin AssignFile(F,filename); {$I-} Reset(F); {$I+} if IOResult = 0 then begin Result := 0; while not Eof(F) do begin ReadLn(F); inc(Result); end; CloseFile(F); end; end; end; |
|
|
der organist 
      
Beiträge: 467
Erhaltene Danke: 17
WIN 7
NQC, Basic, Delphi 2010
|
Verfasst: Mo 22.12.08 19:42
_________________ »Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 22.12.08 19:52
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mo 22.12.08 20:14
jaenicke hat folgendes geschrieben : | Was ist daran besser die komplette Datei erst in den Speicher zu laden, wenn du die dort gar nicht brauchst?  |
Wir haben genug Speicher, es tut keinem weh, ist einfach hingetippt, hinreichend stabil (da geprüfter Code verwendet wird) und funktioniert, ohne groß drüber nachzudenken... Wenn das kein Grund ist.
Du kannst ja eine allgemeingültige Klasse zum zählen von Zeilen in beliebig großen Textdateien schreiben. Dann würde ich per TFileStream sehr große Blöcke einlesen und die #13#10 zählen (wurde schon erwähnt). Dabei müssen blockboundaries berücksichtigt werden (#13 am Ende des aktuellen und #10 am Anfang des nächsten Blockes) usw. Das ist aber nicht trivial und ein eindeutiger Overkill.
_________________ Na denn, dann. Bis dann, denn.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 22.12.08 20:20
Eine einfache Lösung, die ohne die Speicherverwendung auskommt, wurde ja bereits gepostet. 
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mo 22.12.08 20:25
_________________ Na denn, dann. Bis dann, denn.
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 22.12.08 20:25
Wünscht Ihr Euch zu Weihnachten eigentlich Erbsen zum Zählen oder lieber Haare zum Spalten? 
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mo 22.12.08 20:28
Spielverderber 
_________________ Na denn, dann. Bis dann, denn.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 22.12.08 20:28
Ich nehm die Erbsen  .
|
|