![]() |
AW: Eigenes Zeichen für Zeilenende bei ReadLN
Hier ist mal noch die Variante für ReadLn, angepasst mit der Struktur ähnlich der von Furtbichler. Es gibt jetzt von der Geschwindigkeit keinen Unterschied mehr zur MMF-Klasse, jedenfalls für meine Anwendung.
Testdatei: 56MB Text ReadLn Version: 3141349 Funde, Zeit: 1468ms MMF-Klasse Version: 3139069 Funde, Zeit: 1438ms (wegen oben beschriebenen Problems weniger Funde, deshalb wahrscheinlich auch hier minimal schneller)
Delphi-Quellcode:
(Textbuffer steht auf 1024*1024)
function EineSeiteLesen(var pDateiname: TextFile; var pSeite : String; var pZeile: String): Boolean;
begin Result:= True; pSeite:= ''; if pZeile <> '' then pSeite:= pZeile; //Rest aus dem vorherigen Durchlauf while not EOF(pDateiname) do begin ReadLn(pDateiname,pZeile); if Pos(#12,pZeile) > 0 then begin Delete(pZeile,1,1); Exit; end else pSeite:= pSeite + pZeile + #13#10; end; Result:= False; end; |
AW: Eigenes Zeichen für Zeilenende bei ReadLN
Hab' ne Klasse von "früher", wo ich auch viel mit Textfiles gearbeitet habe. Mal eben auf Sebastian’s TSJMmfFileReader Standard gebracht. Mit SSD Festplatte 1,2 sec. für das Einlesen der letzten Seite einer 300 MB Textdatei (Kompliment an Sebastian!). Mit AssignFile und Co (Textbuffer 4K) 2 sec.
Delphi-Quellcode:
function LoadSinglePageFromFile(FileName: string; SinglePage: TStringList;
Index: integer): boolean; // Index = 0 .. PagesCount - 1 const cFormFeed = #12; // ^L PageBreak var FileReader: TSJMmfFileReader; CurrentReadString: string; NewPage: boolean; ReadPagesCount: integer; begin Result := false; if FileExists(FileName) then begin SinglePage.Clear; FileReader := TSJMmfFileReader.Create(FileName); ReadPagesCount := 0; try while (FileReader.Position < FileReader.Size) and (ReadPagesCount <= Index) do begin FileReader.Readln(CurrentReadString); NewPage := Pos(cFormFeed, CurrentReadString) = 1; // *** if NewPage then begin Inc(ReadPagesCount); if ReadPagesCount = Index then begin System.Delete(CurrentReadString, 1, 1); if CurrentReadString <> '' then SinglePage.Add(CurrentReadString); end; end else if ReadPagesCount = Index then SinglePage.Add(CurrentReadString); end; Result := true; finally FileReader.Free; end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz