Thema: Delphi schnell Zeilen zählen

Einzelnen Beitrag anzeigen

akko5

Registriert seit: 13. Dez 2007
5 Beiträge
 
#8

Re: schnell Zeilen zählen

  Alt 13. Dez 2007, 16:58
Zitat von himitsu:
@akko5: ein größerer Speicherblock könnte nicht schaden, damit verringern sich die Lesezugriffe und das ganze ist auch etwas optimaler in Bezug auf die WindowsFileCache/Dateiverwaltung.
BUFFER_SIZE = 65536; // 64 KB
Ja Danke. Hab auch noch einen kleinen Fehler gefunden, dass die letzte Zeile nicht immer gezählt wurde.
So sollte die Funktion perfekt sein:
Delphi-Quellcode:
function PosCount(const SubStr, S: String): Integer;
var
  iPos: Integer;
begin
  Result := 0;
  iPos := 0;
  repeat
    iPos := PosEx(SubStr, S, Succ(iPos));
    if iPos > 0 then Inc(Result);
  until iPos = 0;
end;

function CountLines(const sFile: String): Integer;
const
  BUFFER_SIZE = 65536;
var
  fInput: File;
  cBuffer: Array[1..BUFFER_SIZE] of Char;
  iRead: Integer;
  sBuffer: String;
begin
  Result := 0;
  AssignFile(fInput, sFile);
  try
    ReSet(fInput, 1);
    try
      while not EOF(fInput) do
      begin
        BlockRead(fInput, cBuffer, BUFFER_SIZE, iRead);
        sBuffer := Copy(cBuffer, 1, iRead);
        Inc(Result, PosCount(#10, sBuffer));
      end;
      if sBuffer[Length(sBuffer)] <> #10 then Inc(Result);
    finally
      CloseFile(fInput);
    end;
  except
    //Result := -1;
  end;
end;
Für eine ~100 MB Textdatei (9105111 Zeilen) brauchte die Funktion 296 ms.

MfG
  Mit Zitat antworten Zitat