Thema: Delphi TextFile Zeile suchen

Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: TextFile Zeile suchen

  Alt 23. Okt 2005, 09:38
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?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat