Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TextFile Zeile suchen (https://www.delphipraxis.net/55246-textfile-zeile-suchen.html)

mimi 18. Okt 2005 16:02


TextFile Zeile suchen
 
Hallo,
ich habe die suche verwendet und nichts passendes gefunden.
Ich kann für mein vorhaben kein TStringList oder TSteam nutzen da ich mit großen Textdateien haben möchte die z.b. über 50 MB groß sein könnten.

dafür möchte ich die daten stückweise einlesen und bearbeiten soweit kein problem, das hauptproblem ist volgendes:
es muss doch bei Textdatein ein X und Y wert geben den man verändert kann.
oder wie soll so ein seek funktionieren auser jetzt in einer forschleife alles einzulesen bis zur gesuchten zeile ?

himitsu 18. Okt 2005 16:35

Re: TextFile Zeile suchen
 
Es gibt nur das X.

Bei Textdateien kann man über seek an eine bestimmte Zeichen-Position springen.

In der Textdatei sind ja Zeichen hintereinander aufgereiht und demnach auch die Zeilen ... alle hintereinander.
Die Zeilen sind dabei dur bestimmte Zeichen voneinander getrennt (z.B. #13, #13#10, ...).

Du kannst also nicht so einfach mit Seek in eine bestimmte Zeile, zu einem bestimmten Zeichen springen.



Es sei den alle Zeilen sind gleich groß und du kennst das Zeilentrennzeichen(was dann auch immer das slbe sein muß).
Dann Seek(f, Zeile * (Zeilenlänge + Trennzeichenlänge) + Spalte);

Zeile und Spalte/Zeichenpossition sind beginnen dabei mit Position 0.


Du kannst aber auch, wenn du zur Xten Zeile und dem Yten Zeichen willst, X Zeilen auslesen und dir dann, aus dem zueltzt ausgelesenem String das gewünschte Zeichen raussuchen.

mimi 22. Okt 2005 18:34

Re: TextFile Zeile suchen
 
in der Hilfe steht drin das Seek bei Textfile nicht funktionieren soll.

Aber schade das es kein X und Y variabeln gibt. dann währe es um einiges einfacher und zeitsparender.

Was währe denn die Zeitspandeste variante:
in einer for schleife alle zeilenumbrüche zu zählen und dann bei der geünwschten halt machen ???

evlt. sollte ich das doch mit TFileStream und TWriter und TReader verzuchen, evlt habe ich damit mehr ervolk.

alzaimar 22. Okt 2005 18:42

Re: TextFile Zeile suchen
 
Genau! Verwende einen TFileStream. Der ist ordendlich schnell. Dann klappts auch mit dem Seek.

himitsu 22. Okt 2005 22:41

Re: TextFile Zeile suchen
 
Na ja, das Problem bei SEEK ist, daß man "unkontrolliert" mitten in eine Zeile hinein springt.

Man müßte sich also jedesmal wieder den Anfang der angesprungenen, oder nächsten Zeile selber suchen.
Oder per READLN zur nächsten Zeile gehen.
Delphi-Quellcode:
Seek(Position);
ReadLn;
Da es aber intern noch 'nen Lesepufer gibt und man Seek nicht direkt auf Textdateien anwenden kann (der Compiler weigert sich ja), müßte man also 'nen Umweg gehen und zusätzlich noch den Schreib-/Lesepuffer zurücksetzten -.-''

Also ist es wohl einfacher TFileStream zu verwenden.

mimi 23. Okt 2005 08:08

Re: TextFile Zeile suchen
 
nagut, dann schreibe ich die zeilenlänge einfach vor dem zeilen anfang und schon habe ich das was ich wollte. Problem ist dabei nur das er mit normalen texten nicht arbeiten kann :(

alzaimar 23. Okt 2005 08:38

Re: TextFile Zeile suchen
 
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?

mimi 23. Okt 2005 15:03

Re: TextFile Zeile suchen
 
mein eigetnliches ziel ist es eine Textdatei stückweise zu öffnen d.h. ich habe z.b. 1000 zeilen(nur als beispiel) und ich sehe davon evlt. nur 30 aufeinmal nun möchte ich genre das in ein array diese 30 zeilen kopiert werden und ich sie dort berabeiten kann das problem ist dabei nur: wenn die zeilenanzahl verändert wurde, z.b. wenn zeilen gelöscht bzw. hinzugefügt wurden da habe ich nur zwei möglichkeiten
1. ich erstelle eine neue datei(vermutlich die einfachste lösung)
2. ich verschiebe die zeilen in der alten datei


und dann soll per seiten darauf zugegriefen werden können z.b.
LoadNexPage
LoadPage(Index:Integer) undsoweiter

weil sowas habe ich noch nicht für delphi finden können.

und es ist besitmmt auch schneller wenn nich alles geladen wird sondern nur den teile den ich sehen kann oder ?

es gibt aber noch mehr probleme bei diesem vorhaben:
1. Passende datei klasse finden(ich nutzte jetzt TFileStream)
2. Änderungen in große datei einfügen(da habe ich mir schon was ausgedacht was klappen müste)
3. das suchen in einer Großen datei

das eigentlich problem ist aber das die zeilen pos gesetzt werden muss am besten währe natürlich mit x und y weil es ja sowas eigetnlich geben muss(intern) oder ? aber extern gibt es leider nur X

edit: so wie die das machen und so wie du es vorschläng hatte ich es auch schon. da wollte ich schon die länge der zeilen einfach davor schreiben *G*

himitsu 23. Okt 2005 17:43

Re: TextFile Zeile suchen
 
Also sowas scheint es anscheinend noch nicht zu geben, da wirst du dir wohl selber was bastenl müssen.


Im Moment (wenn ich mal Zeit hab), bin ich dabei eigene Dateifunktionen zu basteln.
Also eine eigene Version von dem bekannten TextFile/File of xxx.
Dieses ist jetzt auch schon fast fertig ... parallel dazu existiert dann auch noch 'ne Version, welche man auf den Arbeitsspeicher aufsetzten kann.
Und wenn man die 2. Version auf 'ne MemoryMappedFile aufsetzten würde, dann kätte man Dateifunktionen, welche mit dem Tempo des RAMs arbeiten und die Datei dennoch nicht volltändig im RAM gelegt ist.
Bei den MemoryMappedFiles wird ja nur der Teil in den RAM geladen, welcher auch im Moment benötig wird.
(Luckie wird sich bestimmt ärgern, jetzt wo er sich ja was anderes gesucht hat)

mimi 30. Okt 2005 07:12

Re: TextFile Zeile suchen
 
das würde ja bedeuten MemoryMappedFiles sind das was ich suche ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz