Wenn du in einem TFileString in eine bestimmte Zeile springen willst, dann schreib Dir einfach eine Funktion, die das macht:
Delphi-Quellcode:
Procedure SeekText (aTextStream : TStream; aRow, aCol : Integer); // aRow = Zeile>0, aCol = Spalte > 0
Const
szCRLF = #13#10;
Var
iRow, j : Integer;
Function NextChar : Char;
Begin
aTextStream.Read (Result,1)
End;
Begin
aTextStream.Seek (0, soFromBeginning);
iRow := 1;
j:=1;
While aRow<>iRow Do
if NextChar = szCRLF[j] Then Begin
inc(j);
if j>Length (szCRLF) Then begin
j:=1;
inc(iRow);
End
End
Else
j := 1;
// Aktuelle Position der Streamposition ist das erste Zeichen der aRow.ten Zeile
// Jetzt nur noch zur ensprechenden Zeile Springen
For j:=1 to aCol-1 do NextChar;
End;
Ich habe das nicht getestet, kann also sein, das hier massig Fehler drin sind, aber im Prinzip gehts so:
Ich fange am Anfang an und zähle jedesmal, wenn ich auf ein #13#10 (CR + LF) stosse, eins zu einem internen Zeilenzähler, bis die gewünschte Zeile gefunden wurde. Dann gehe ich noch 'aCol-1' Zeichen nach rechts und dann befindet sich die Streamposition genau auf der gewünschten Position. Der Nachteil ist, das das nicht sonderlich schnell ist, wenn Du die Routine mehrmals aufrufst, weil immer von Vorne angefangen wird. Das kann man natürlich optimieren, indem man eine Klasse schreibt, die sich die aktuelle Position (Zeile/Spalte) merkt und von da aus relativ wandert. Dann kann man, vermutlich sehr schnell, von Zeile zu Zeile hüpfen.
Hier, bei den
den Schwyzern, findest Du eine Funktion, die eine bestimmte Zeile auslesen kann.
Was willst Du denn genau? Was suchst Du in 40-50MB grossen Textdateien?