Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Schnell Anzahl der Zeilen einer Textfile ermitteln? (https://www.delphipraxis.net/38597-schnell-anzahl-der-zeilen-einer-textfile-ermitteln.html)

Kedariodakon 21. Jan 2005 15:16


Schnell Anzahl der Zeilen einer Textfile ermitteln?
 
Wie macht man das am dümmsten? :gruebel:

Vorweg, die Files sind >5MB und haben Viele viele Zeilen :wink:

Bye

Dax 21. Jan 2005 15:17

Re: Schnell Anzahl der Zeilen einer Textfile ermitteln?
 
Delphi-Referenz durchsuchenTStringList.LoadFromFile und Delphi-Referenz durchsuchenTStringList.Count dürften dir hier sehr viel weiterhelfen ;-)

Bernhard Geyer 21. Jan 2005 15:19

Re: Schnell Anzahl der Zeilen einer Textfile ermitteln?
 
Soll nur die Anzahl der Zeilen ermittelt werden oder auch danach der Inhalt der Datei (z.B. in TStringList) verfügbar sein?

Kedariodakon 21. Jan 2005 15:19

Re: Schnell Anzahl der Zeilen einer Textfile ermitteln?
 
Öhm nicht wirklich, dass dauert ewig :roll:

Das hatte ich vorher so...

bye


Edit: Nur die Anzahl der Zeilen!

MaBuSE 21. Jan 2005 15:25

Re: Schnell Anzahl der Zeilen einer Textfile ermitteln?
 
Zitat:

Zitat von Kedariodakon
Edit: Nur die Anzahl der Zeilen!

DU wirst nicht darum kommen die komplette Datei zu lesen.
Aber Du brauchst Dir die Daten ja nicht merken (im Speicher)
Also Datei komplett lesen und nach CR suchen (#13).
Ausprobieren ob Traditionell (read(f,x)) oder Streams schneller sind.

Viel Spaß ;-)

Bernhard Geyer 21. Jan 2005 15:25

Re: Schnell Anzahl der Zeilen einer Textfile ermitteln?
 
Dann solltest Du die Datei Binär durchlaufen

1, Öffnen mit TFileStream
2a, Falls die Datei nicht >> 5 MB wird: Komplett in einen Schwung einlesen
2b, Falls Datei >> 5 MB häbchenweise einlesen, damit Windows nicht das Auslagern von Speicher anfängt
3, Per Speichervergleich nach CRLF-Kombinationen suchen und diese Zählen.

TStringList mach sowas ähnliches, hat jedoch den Nachteil das es noch viel mehr Aktionen durchführt, die du fürs reine Zählen nciht benötigst

Kedariodakon 21. Jan 2005 15:27

Re: Schnell Anzahl der Zeilen einer Textfile ermitteln?
 
Werd ich versuchen :zwinker:

Thx


Bye

Dax 21. Jan 2005 15:31

Re: Schnell Anzahl der Zeilen einer Textfile ermitteln?
 
Hmm... so?

Delphi-Quellcode:
var
  Content: string;
  I, LineCount: Integer;
  D: DWORD;
begin
  Content := (Inhalt der Datei);
  LineCount := 0; // Zeilenzahl der Datei
  for I := 0 to Length(Content) div sizeof(D) do
  begin
    Move(Content[I*sizeof(D)+1], D, sizeof(D));
    D := D AND $0D0D0D0D; // Maske. Kommt das Zeichen #$0D (#13) vor, fängt eine neue Zeile an
    if D <> 0 then
    begin
      if D AND $0D = $0D then Inc(LineCount);
      if D AND $0D00 = $0D00 then Inc(LineCount);
      if D AND $0D0000 = $0D0000 then Inc(LineCount);
      if D AND $0D000000 = $0D000000 then Inc(LineCount);
    end;
  end;
end;

MaBuSE 21. Jan 2005 16:18

Re: Schnell Anzahl der Zeilen einer Textfile ermitteln?
 
Zitat:

Zitat von Kedariodakon
Werd ich versuchen :zwinker:

Hab mal ein Bsp. von Luckie als Grundlage genommen:
( http://www.delphipraxis.net/internal...=295199#295199 )

Eine Datei >2,5 MByte brauchte bei mir 7 Sek.
(Keine Ahnung wie viel das schneller wird, wenn der Buffer vergrößert wird)

Delphi-Quellcode:
function CountCR(const AFileName: string):Integer;
var
  Fs: TFileStream;
  BytesRead: Integer;
  Buffer: char;
  CR: Integer;
begin
  CR := 0;
  Fs := TFileStream.Create(AFileName, fmOpenRead + fmShareDenyNone);
  try
    repeat
      BytesRead := Fs.Read(Buffer, Length(Buffer));
       if Buffer = #13 then Inc(CR)
     until BytesRead < sizeof(Buffer);
  finally
    Fs.Free;
    Result := CR;
  end;
end;

yankee 21. Jan 2005 16:30

Re: Schnell Anzahl der Zeilen einer Textfile ermitteln?
 
Mal ganz einfach:
Delphi-Quellcode:
function getlength(const FileName: TFileName)
var datei:textfile
    str:string;
begin
  result =0;
  assignfile(datei, FileName);
  reset(datei);
  while not eof(datei) do
  begin
    readln(datei, str);
    inc(result);
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:27 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