![]() |
AW: Eigenes Zeichen für Zeilenende bei ReadLN
Hallo Uwe, da hab ich wieder was dazugelernt :!: Dafür danke ich dir :thumb:
Zitat:
Das war ein Irrtum, ich hatte es in XP-64 gestestet: Zitat:
Zitat:
|
AW: Eigenes Zeichen für Zeilenende bei ReadLN
Zitat:
|
AW: Eigenes Zeichen für Zeilenende bei ReadLN
So ich habs mal mit dem Filestream gemacht. Das geht gar nicht, also von der Geschwindgkeit her ...
Bei einer Textdatei von 8Mb brauchte das ca 36s, mit ReadLn und angepassten TextBuffer hingegen nur ca 65ms.
Delphi-Quellcode:
Ich werde mir noch die Klasse von jaenicke ansehen. Danke für den Hinweis.
var
FileStrm1: TFileStream; Ch: Char; GesLength: Integer; Gesucht,Seite: String; StrList1: TStringList; begin Gesucht:= ( UTF8Decode( Edit1.Text ) ); StrList1:= TStringList.Create; FileStrm1:= TFileStream.Create('Textdatei.txt',fmOpenRead); try GesLength:= 0; while FileStrm1.Position < FileStrm1.Size do begin Seite := ''; while (FileStrm1.Read(Ch, 1) = 1) and ( Ch <> #12 ) do //Seite in String speichern Seite := Seite + Ch; ... {Textsuche und weitere Auswertung, Ergebnisse in Stringlist speichern...} ... GesLength:= GesLength + SeitenLength + 1; end; finally FreeAndNil(StrList1); FreeAndNil(FileStrm1); end |
AW: Eigenes Zeichen für Zeilenende bei ReadLN
Wenn die Textstruktur erhalten bleiben soll, muss man es auch so einlesen:
- zeilenweise vom Zeilenanfang bis Zeilenende #13#10 - seitenweise bis zum 1. Auftreten von #12, dann vom 1.Zeichen nach #12 bis zum nächsten #12 usw. Steuerzeichen: 0001100,0xc,12,FF=Form Feed - Setzt Cursor auf Zeilenvorschub einer vorangegangenen Zeile |
AW: Eigenes Zeichen für Zeilenende bei ReadLN
Das ist auch nicht weiter verwunderlich :) schickst du doch den FileStream immer wieder an das Ende der Datei und dann zurück an die aktuelle Leseposition (
Delphi-Quellcode:
).
FileStrm1.Size
Darum solltest du dir die Größe des Streams zwischenspeichern, dann sollte das erheblich schneller vonstatten gehen ;)
Delphi-Quellcode:
var
FileStrm1: TFileStream; LStreamSize : Int64; // lokale Variable Ch: Char; GesLength: Integer; Gesucht,Seite: String; StrList1: TStringList; begin Gesucht:= ( UTF8Decode( Edit1.Text ) ); StrList1:= TStringList.Create; FileStrm1:= TFileStream.Create('Textdatei.txt',fmOpenRead); try GesLength:= 0; // Stream-Size merken LStreamSize := FileStrm1.Size; // und damit prüfen while FileStrm1.Position < LStreamSize do begin Seite := ''; while (FileStrm1.Read(Ch, 1) = 1) and ( Ch <> #12 ) do //Seite in String speichern Seite := Seite + Ch; ... {Textsuche und weitere Auswertung, Ergebnisse in Stringlist speichern...} ... GesLength:= GesLength + SeitenLength + 1; end; finally FreeAndNil(StrList1); FreeAndNil(FileStrm1); end |
AW: Eigenes Zeichen für Zeilenende bei ReadLN
Es wird 2x geprüft, ob noch Zeichen da sind, und zwar einmal beim Abfragen der Position und dann nochmal ob das Lesen eines Zeichens funktioniert hat. Das ist nicht schön.
Ich würde eine Funktion schreiben, die genau eine Seite liefert und True/False, ob noch weitere Seiten zu erwarten sind.
Delphi-Quellcode:
Function ReadOnePage (myFileStream : TStream; Var Page : String) : boolean;
Const CharSize = SizeOf(Char); Var Ch : Char; Begin result := True; Page := ''; While myFileStream.Read(Ch,CharSize) = CharSize do if Ch=#12 then exit else Page := Page + Ch; result := false; End; // Der eigentliche Aufruf ist dann ziemlich selbsterklärend While ReadOnePage (myFileStream, Page) Do ProcessPage(Page) |
AW: Eigenes Zeichen für Zeilenende bei ReadLN
@Furtbichler Danke für den Hinweis, allerdings konnte mit der Funktion keinen wesentlichen unterschied merken, auch ca 36s für die Suche von ca 2200 Wörtern.
Zitat:
|
AW: Eigenes Zeichen für Zeilenende bei ReadLN
Wie schon geschrieben, mit der MMF wie ich es mache, geht es natürlich deutlich schneller als zeichenweise aus der Datei selbst zu lesen.
Das Problem hatte ich als ich für einen Registryeditor die .reg Dateien einlesen wollte. Und dort konnte ich dann eine solche 350 MiB Datei in wenigen Sekunden komplett einlesen und parsen. |
AW: Eigenes Zeichen für Zeilenende bei ReadLN
Zitat:
Wenn Du an der Performance herumschrauben willst, dann versuche mal, den Algorithmus zu verbessern. Ach, und nimm endlich Sebastian Jänicke's MMF-Teil. |
AW: Eigenes Zeichen für Zeilenende bei ReadLN
Zitat:
Zitat:
Den Teil hatte ich schon ausprobiert, allerdings wollte ich das "kleine Problem" nicht gleich mit einer neuen Unit erschlagen. Muss man auch nicht wenn man bauminas ersten Vorschlag etwas anpasst, dann hat man eine schnelle und einfache Lösung. Gut Jänicke's MMF-Teil ist noch ein wenig schneller, aber da habe ich auch noch ein Problem mit. Ich habe den Delimiter auf #12 gestellt um die Seiten ganz zu erfassen. Schaut man sich die Zeile (bzw. Seite) im Debugger an, fehlt allerdings das erste Zeichen einer Zeile (bzw. Seite) im zweiten Durchlauf. Das liegt sicher daran das ja sonst die zwei Zeichen #13#10 benutzt werden. Gibt es da noch eine Option die ich übersehen habe oder muss man was umschreiben ? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:29 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