AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TextFile Zeile suchen

Ein Thema von mimi · begonnen am 18. Okt 2005 · letzter Beitrag vom 30. Okt 2005
Antwort Antwort
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#1

TextFile Zeile suchen

  Alt 18. Okt 2005, 17:02
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 ?
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

Re: TextFile Zeile suchen

  Alt 18. Okt 2005, 17:35
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.
$2B or not $2B
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#3

Re: TextFile Zeile suchen

  Alt 22. Okt 2005, 19:34
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.
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: TextFile Zeile suchen

  Alt 22. Okt 2005, 19:42
Genau! Verwende einen TFileStream. Der ist ordendlich schnell. Dann klappts auch mit dem Seek.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

Re: TextFile Zeile suchen

  Alt 22. Okt 2005, 23:41
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.
$2B or not $2B
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#6

Re: TextFile Zeile suchen

  Alt 23. Okt 2005, 09:08
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
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
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
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#8

Re: TextFile Zeile suchen

  Alt 23. Okt 2005, 16:03
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*
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

Re: TextFile Zeile suchen

  Alt 23. Okt 2005, 18:43
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)
$2B or not $2B
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#10

Re: TextFile Zeile suchen

  Alt 30. Okt 2005, 08:12
das würde ja bedeuten MemoryMappedFiles sind das was ich suche ?
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:45 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