Autor Beitrag
der organist
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 467
Erhaltene Danke: 17

WIN 7
NQC, Basic, Delphi 2010
BeitragVerfasst: 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 user profile iconChristian 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 439
Erhaltene Danke: 3

W2K
D7
BeitragVerfasst: Mo 22.12.08 13:22 
Ich würde die Datei laden, zeilenweise lesen, Zähler hochzählen.

ala:

ausblenden 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



BeitragVerfasst: Mo 22.12.08 13:31 
Oder mit einer TStringlist:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 439
Erhaltene Danke: 3

W2K
D7
BeitragVerfasst: 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



BeitragVerfasst: Mo 22.12.08 13:35 
Klasse ja, Komponente nein.
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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



BeitragVerfasst: Mo 22.12.08 14:00 
Das ist zweifellos richtig, aber dann sollte man auch Fehlerfälle behandeln.
der organist Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 467
Erhaltene Danke: 17

WIN 7
NQC, Basic, Delphi 2010
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 467
Erhaltene Danke: 17

WIN 7
NQC, Basic, Delphi 2010
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2195

XP
D3Prof, D6Pers.
BeitragVerfasst: Mo 22.12.08 17:50 
user profile iconder organist hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 447
Erhaltene Danke: 2

W2K, XP, Vista64, Win7 64
RAD-Studio 2010
BeitragVerfasst: Mo 22.12.08 18:01 
Mal angenommen, man hätte ein konstante Zeilenbreite von 100 Zeichen, dann ginge es auch so:
ausblenden 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



BeitragVerfasst: Mo 22.12.08 18:51 
Um das einmal zu komplettieren (speicherschonende Variante mit Fehlerbehandlung):
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 467
Erhaltene Danke: 17

WIN 7
NQC, Basic, Delphi 2010
BeitragVerfasst: Mo 22.12.08 19:42 
user profile iconBlackheart666 hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconder organist hat folgendes geschrieben Zum zitierten Posting springen:
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.


zwischen einfach und schwierig ein großer Unterschied ist, junger Padawan :D Nein, es geht mir um eine einfache Lösung, ohne neue Komponenten oder Typen...

_________________
»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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 22.12.08 19:52 
user profile iconBlackheart666 hat folgendes geschrieben Zum zitierten Posting springen:
Obwohl doch die bessere und wohl auch einfachere Variante die von DeddyH ist.
Was ist daran besser die komplette Datei erst in den Speicher zu laden, wenn du die dort gar nicht brauchst? :gruebel:
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 22.12.08 20:14 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Was ist daran besser die komplette Datei erst in den Speicher zu laden, wenn du die dort gar nicht brauchst? :gruebel:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 22.12.08 20:20 
Eine einfache Lösung, die ohne die Speicherverwendung auskommt, wurde ja bereits gepostet. :roll:
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 22.12.08 20:25 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Eine einfache Lösung, die ohne die Speicherverwendung auskommt, wurde ja bereits gepostet. :roll:
Die nicht sonderlich performant ist :roll: :wink:

_________________
Na denn, dann. Bis dann, denn.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 22.12.08 20:25 
Wünscht Ihr Euch zu Weihnachten eigentlich Erbsen zum Zählen oder lieber Haare zum Spalten? :mrgreen:
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 22.12.08 20:28 
Spielverderber :schmoll:

_________________
Na denn, dann. Bis dann, denn.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 22.12.08 20:28 
Ich nehm die Erbsen :D.