Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Lesen, Schreiben und mehr in Textdateien - TFileStream, ...? (https://www.delphipraxis.net/56870-lesen-schreiben-und-mehr-textdateien-tfilestream.html)

Totti 12. Nov 2005 15:10


Lesen, Schreiben und mehr in Textdateien - TFileStream, ...?
 
Hi, gleich zu Beginn die Problemstellung:
Ich möchte in einer Textdatei lesen und gerne auch schreiben ... und zwar möglichst nach folgender Sytax ...

while x=t do readln(f,x); //das macht er beispielsweise 10x, weil dann zeile 11 netmehr gleich t ist
zeile_11:=u;
etc.

Also, das Problem ist halt, dass ich ja in der schleife die zeile 11 schon gelesen habe und der zeiger nun bereits am ender der 11 (bei read) bzw. am anfang der 12er (bei readln) steht und ich für ein bearbeiten der 11. zeile die ganze datei von vorne lesen müsste ... da ich wohlgemerkt momentan mit f: textfile; arbeite.

Hab nun schon bisch gesucht und co und selbstverständllich bin ich auf die tfilestreams gestoßen - doch scheint mir das mit denen auch nicht gerade ein kinderspiel zu werden, mit textdateien zu arbeiten.

Was ist eurer meinung nach die beste Lösung?
Vielen Dank im Voraus,

Malte

SirThornberry 12. Nov 2005 15:19

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
bei FileStream gibt es kein ReadLn, du musst also zeischen für Zeischen durchgehen und den Zeilenumbrauch suchen. Im übrigen gibt es bestimmt auch funktionen um im textfile die position zu ändern (seek etc. ?)

Totti 12. Nov 2005 15:49

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
ne, seek läuft net bei textfile

Und mit TFilestream müsste ich statt readln dann immer ne funktion verwenden, die alle zeichen bis zum nächsten crlf ausgibt, gel?

SirThornberry 12. Nov 2005 15:57

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
genau, readln macht ja letztendlich auch nix anderes als die datei zu lesen bis ein zeilenumbruch kommt, und das musst du dir eben selbst schreiben.

omata 12. Nov 2005 15:58

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
Moin,

Zitat:

Zitat von SirThornberry
...du musst also Zeischen für Zeischen durchgehen...

das bedeutet man nimmt "file of byte" und dort geht dann auch seek.

Aber was ich nicht verstehe ist das Schreiben. Durch so ein Vorgehen kannst du die Länge einer Zeile nicht verändern. Wie stellst du dir das vor?

MfG
Thorsten

Totti 14. Nov 2005 14:02

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
hmm, nunja .... hab ich j a hinbekommen.
Ich krieg aber nur Zeichen ersetzt - muss ich nu für jede Zeilenänderung alle nachfolgenden Zeichen nach vorne ziehen/nach hinten schieben?!?

Gibbet da absolut keine Alternative?

BrunoT 14. Nov 2005 14:20

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
Hallo lotti,

Versuchs mal mit TStrings, da liest du die ganze Datei mit LoadFromFile ein, änderst die Zeilen, und schreibst sie wieder mit SaveToFile zurück.

mfg

BrunoT

Totti 25. Nov 2005 17:05

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
ne TSTringList verschlingt leider zuviele Ressourcen, braucht ergo zu lange ...
das sind Textdatein zwischen 400kb und 4MB ... da kommen einige Zeilen zusammen, leider :(

Aber wie es aussieht, muss es dann halt länger dauernn, was?

omata 25. Nov 2005 22:21

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
Hallo,

schau dir doch mal BlockRead und BlockWrite an.

Hier ein Beispiel, ich habe eine 11MB Datei ohne Probleme sehr schnell eingelesen.

Delphi-Quellcode:
procedure Einlesen;
var Datei: file;
    Laenge:integer;
    Inhalt:string;
begin
  assignfile(Datei, 'datei.txt');
  try
    reset(Datei, 1);
    Laenge:=FileSize(Datei);
    setlength(Inhalt, Laenge);
    BlockRead(Datei, Inhalt[1], Laenge);
  finally
    CloseFile(Datei);
  end;
end;
Der Inhalt der Datei steht dann im String Inhalt.

Ich verstehe nicht was du da genau machen willst, deshalb nur das Beispiel zum Einlesen.

MfG
Thorsten

Totti 26. Nov 2005 08:56

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
dann hab ich nen paar zigtausend zeichen in nem string .... ja.

Wie gesagt, ich muss lesen und bearbeiten, ich vesuch mal nen Beispiel zu konstruieren:
Delphi-Quellcode:
Totti
AS Roma
Ilary
Christian
27
09
1976
Roma
Italia
...
Und das nen paar tausend Mal. Nun geh ich von oben jede Zeile durch ... und wenn ich beispielsweise auf die Zeile 1976 Stoße, möchte ich die Zeile drüber (hier 09) verändern.
Mit ReadLn/WirteLn, also nem "textfile" klappt das ja so nicht - und ne Stringlist war mir zu langsam - aber wie es ausschaut, momentan der einzig vernünftige weg.

Es sei denn, ich arbeite mit deinem Monsterstring und arbeite mich dadrin vor und zurück ... dann zieh ich aber glaub ich doch eher ne List vor, ist komfortabler.

himitsu 26. Nov 2005 09:27

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
Du könntest natürlich auch erstmal alles in ein dynamisches Array einlesen (pro Zeile ein Array-Feld), die nötigen/gewünschten Änderungen vornehmen und dann dieses wieder in die Datei zurückschreiben. (das Einlesen wird aber etwas, bis sehr viel langsamer werden, als mit 'nem einzelnem String ... je nachdem wie du dieses optimierst)


Zitat:

Zitat von Totti
ne, seek läuft net bei textfile

Nicht ganz die Warheit :mrgreen: mein Seek64 funktioniert inoffiziell damit. > 64-Bit für TextFile / File of xxx
Allerdings muß man dort wissen, was man macht, da ja der nachfolgende Text nicht verschoben wird, wenn die neue Zeile (welche man reinschreiben möchte) länger/kürzer ist, als die Aktuelle (welche im Moment in der Datei drinsteht), weßhalb ich dieses Feature nicht offiziell erwähnt hab.

Totti 27. Nov 2005 11:32

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
ja, das mitm array wäre ne gute Idee ... wenn es denn schneller als ne TStringList ist, wie ich hoffe. DAs gute wäre eben, dass man Zeilen direkt anspringen kann, im gegensatz zu dem einzelnen string ... wäre halt alles ein wenig übersichtlicher von der handhabung her. Ich versuchs mal damit, danke für den Tip.


Den anderen kann ich leider weniger gebrauchen, da es wohl häufiger vorkommen wird, dass ich was längeres/kürzeres eintragen muss.

mimi 27. Nov 2005 12:44

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
ich verstehe dein problem denn genau das gleiche habe ich auch mit playlisten.

Ich möchte nämnlich eine große datei von über 10.000 zeilen berabeiten und habe dort nur paar möglichkeiten.

1. Ich lese mit TFileStream(ist die beste wahl glaube ich auch wenn es mit dem debugger schwirik wird)
den block ein denn ich möchte z.b.
die ersten zwei zeilen vor jeder zeile steht die länge und die addierst du einfach zusammen und fertig.

anschließend schreisbt du jede zeile in ein array und bearbeites diesen in einem memo problem dabei ist wenn sich die zeilen anzahl verwändert dann muss du ein neuen array erstellen und denn in die datei zurück schreiben wobei genau hier kommt ein problem auf:
verschieeb ich alle zeieln nach hinten ?
oder erstelle ich eine neue datei z.b. so:
ich weiß das ich die ersten zwei zeilen geändert habe also kopiere ich zuerst die neuen datein in die datei rein und dann kopier ist aber der 21 zeile alles bild in die neue datei rein.
(das währe das einfachste glaube ich, oder ?

2. du machst es mit "File of Text" wobei hier kannst du den zeilen inder nicht einfach mit seek ändern

3. du machst das so wie bei 1. nur du speicherst die blöcke nicht in die große datei sondern legst mehre kleine ein, und wenn du fertig bist kopiert du alles zusaemmn.

warscheinlich ist es am besten ein misch aus 1 und 3 zu machen.

Totti 27. Nov 2005 13:56

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
Ich darf zum Glück garnicht die zeilenanzahl verändern, weil ich dann die Sytax durcheinander bringe ... nur die Zeilenlängen :)

Aber was meintest du mit "id eLänge steht vor jeder Zeile"?
ich meine mich zu erinnern, dass ich mir mal den Stream angeschaut hab und die Zeilen lediglich durchein #13#10 getrennt waren und net noch mit ner Zusätzlichen Längenangabe.

Ode rist da sjetzt dein spezifisches Playlistformat?

alzaimar 27. Nov 2005 14:33

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
Zitat:

Zitat von himitsu
...
Zitat:

Zitat von Totti
ne, seek läuft net bei textfile

Nicht ganz die Warheit :mrgreen: mein Seek64 funktioniert inoffiziell damit.

Äh, dem TFilestream.seek ist es doch völlig egal, wohin es den FilePointer per 'Seek' hinschiebt. Ergo geht TFileStream.Seek mit allen Dateien. Ausnahmslos. :mrgreen:
Was Du benötigst, ist ein Random File Access auf eine Textdatei. Das ist immer mit einem zusätzlichen Aufwand verbunden. Eine TStringlist ist ordendlich flott und sooo einfach. Teste das erstmal, bevor Du bezweifelst, ob Dir das reicht.

Wenn Du dann doch noch schnellere Tools brauchst, dann verwende ein TFileStream, lies die Datei in einen internen Buffer und schreibe Dir eigene Routinen, um diesen Buffer zeilenweise zu manipulieren. In Zeiten, wo der CPU in GHZ gemessen wird, sollten die Prozeduren unterhalb der Messgenauigkeit liegen. Wie lange dauert es denn, 4MB Textdaten im Speicher zu verschieben, um eine neue Zeile an erster Stelle einzufügen?

Imho gibt es keine Möglichkeit, "mal eben" (also sehr schnell) die 1517.te Zeile einer 122.959.454 Zeilen umfassenden Textdatei zu löschen.
Dazu sind eben Dateien mit fester Recordgröße ("File Of TRecord") da. Oder Datenbanken.

Totti 27. Nov 2005 14:58

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
Dass das seek net geht war auf file of text bezogen und net auf das Öffnen einer txt-datei mittels tfilestream.

Des Weiteren macht es erhebliche Unterschiede, ob du ne TStringlist zum einlesen und durchforsten (ohne Schreibvorgang) nutzt oder file of text mit anschließendem readln, wenn du 200 Dateien mit ner gesamtgröße von 40MB hast ... glaubs mir, das macht gut und gerne mal 30 Sekunden unterschied.

alzaimar 27. Nov 2005 15:05

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
Nee, is klar. Ich wusste nicht (zu faul, den Thread zu lesen?) das Du massenhaft Dateien verarbeiten musst. Ich mach mir normalerweise die Mühe nicht und verwende TStringList weil das nur 5 Zeilen sind (Create,Load,Modify,Write,Free). Ein wenig kann man noch rausholen, indem man die TStringList.Capacity am Anfang hochsetzt.

[edit] Das mit den 30 Sekunden kann bei 40MB ich nicht nachvollziehen. TStringList.LoadFromFile dauert bei einer 50MB Textdatei 800ms [/edit]
Ich habe mal mit TFileStream auf Textdateien gearbeitet. Schneller hab ich es nicht hinbekommen. Es geht aber schneller, und zwar mit Scatter/Gather I/O. Tut aber weh.

Wenn es flott gehen soll, würde ich mit TFileStream arbeiten. Musst Du nur jeweils eine Zeile verändern?

Totti 27. Nov 2005 18:14

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
Nein ... in einigen Dateien garkeine, in eingen mehere Hundert Zeilen ... ich muss aber in jedem Fall alle Zeilen durchgehen ...
und die, die geändert werden, die haben dann meist net dieselbe Länge wie vorher, sondern gerne mal das 9-fache (von 1 zeichen auf 9 ^^).

Und wieso das mit der TStringlist solang dauert ... naja ... in den Prozeduren waren auch vergleiche und vermischen und sortieren ud wieder abgleichen zusätzlich zu indexof (habe keine sortierten listen) aktionen ...

Der Code war bestimmt auchnet der beste :D

alzaimar 27. Nov 2005 18:29

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
Was Du machen könntest, ist Folgendes:
Delphi-Quellcode:
Procedure ProcessFile (aFile : String);
Var
  fIn, fOut : TFileStream;

Begin
  fIn := TFileStream.Create (aFile, fmOpenRead);
  Try
    fOut := TFileStream.Create (ExtraceFilePath (aFile)+'Temp.$$$', fmCreate);
    Try
      While ReadString (fIn, aString) Do
        WriteString (fOut, TranslateLine (aString));
    Finally
      fOut.Free;
    End;
  Finally
    fIn.Free;
  End;
  DeleteFile (aFile);
  RenameFile (ExtraceFilePath (aFile)+'Temp.$$$', aFile);
End;
Die Funktion 'TranslateLine' soll dann die Zeile übersetzen... Was ich hier veranschaulichen wollte, ist das rüberschaufeln und gleichzeitige Übersetzen. Wenn Du das hinbekommst, sollte es eigentlich recht flott gehen... Die ReadString und WriteString Routinen musst Du dir noch zurechtbasteln.

Totti 27. Nov 2005 18:33

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
Ähm, vielen Dank, für die Mühe, die du dir machst. Wenn ich aber in Zeile 9923 auf einen bestimmten Ausdruck stoße, wäre es im Idealfall gut, in Zeile 9845 daraufhin etwas ändern zu können.


Ich check einfach mal aus, wie schnell sich die TSTringListen machen, wenn man den Quelltext net so hinmüllt wie ich vor 1,5 Jahren als blutiger Anfänger - wenn ich dann zeit und Lust habe, schreib ich die Passagen, die nur ein Editieren der aktuellen oder maximal eine drüberliegende Zeile brauchen, mal um, um den Zeitunterschied feststellen zu können. Wenn das nächstes Jahr Weihnachten dann soweit ist, geb ichs hiermal kurz durch ^^

himitsu 27. Nov 2005 21:35

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
Zitat:

Zitat von alzaimar
Äh, dem TFilestream.seek ist es doch völlig egal, wohin es den FilePointer per 'Seek' hinschiebt. Ergo geht TFileStream.Seek mit allen Dateien. Ausnahmslos. :mrgreen:

OK, mit FileStreams kenn ich mich nicht extrem gut aus, aber bei 'ner normalen "TextFile" geht das mit dem Seek halt nicht ... jedenfalls nicht bei der von Borland mitgelieferten Seek-Funktion :?

Totti 28. Nov 2005 10:46

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
Okay, habe mit unten stehendem Code mal die Zeit gemessen
a) Einlesen in ein Array mittels textfile
b) Nutzen einer TStringList

Habe jeweils eine 1,6MB große Textdatei mit ca 280.000 Zeilen eingelesen und dann nach einer Zeile gesucht.
Es wird auch jeweils wieder der Speicher freigegeben (hoffe ich ^^).

Die Methode a) ist definitiv schneller (liegt meist bei ~92ms) als b) (meist ~125ms). Sind zwar nur 30ms ...
wenn mans aber 30x macht, isset schon ne Sekunde ... bei 3.000 Aktionen hat man 10 Sekunden :D

Nehme jedoch auch gerne Hinweise an, wie ich die beiden Algos weiter optimieren kann (das setzen der capazity bei der Liste bringt wirklich was :) - beim Array jedoch eher nicht)!


Delphi-Quellcode:
function doArray: integer;
var
  arr: array of String[50];
  f: textfile;
  i: integer;
  tmpStr: string[50];
begin
  Assignfile(f, path);
  reset(f);
  setlength(arr,500000);
//  setlength(arr,0);
  i:=0;
  while not eof(f) do
    begin
//      setlength(arr,length(arr)+1);
      readln(f,arr[i]);
      inc(i);
    end;
  setlength(arr,i);
  CloseFile(f);
  i:=0;
  while not (arr[i] = 'Ballack') do
    inc(i);
  result:=i;
  setlength(arr,0);
  tmpstr:='';
end;


function doList: integer;
var
  list: TSTringList;
begin
  list:=TSTringList.create;
  list.Capacity:=500000;
  list.LoadFromFile(path);
  result:=list.IndexOf('Ballack');
  FreeAndNil(list);
end;

var
  time: integer;
begin
  { TODO -oUser -cConsole Main : Hier Code einfügen }
{  time:=GetTickCount;
  writeln(IntToStr(doArray));
  writeln(IntToStr(GetTickCount-time));}
  time:=GetTickCount;
  writeln(IntToStr(doList));
  writeln(IntToStr(GetTickCount-time));
  readln;
end.

marabu 28. Nov 2005 11:18

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
Hallo Malte,

in diesem thread wird eine technische Umsetzung für ein ungenau beschriebenes abstraktes Problem diskutiert. Bessere Ergebnisse erhältst du, wenn du das dahinter stehende Anwendungsproblem skizzierst. Ein erfahrener Programmierer wird dann die passende Abstraktion wählen und dir einen optimalen Implementierungsvorschlag machen. Die Anforderungen, die du hier bröckchenweise einreichst, scheinen mir eher der Verschleierung zu dienen. Handelt es sich denn um ein Geheimprojekt?

Auf jeden Fall scheint deine Textdatei keine optimale Repräsentation der Daten zu sein. Wenn das Datenformat fremdbestimmt ist, dann würde ich mir zumindest für die interne Datenhaltung eine clevere Struktur zurechtlegen. Wenn du Syntax und Semantik für deine Textdateien angeben kannst, dann tue es bitte. Und auch die Operationen auf diesen Textdaten musst du hinreichend beschreiben.

Die Qualität der Problembeschreibung hat einen wesentlichen Einfluß auf die der Hilfestellung.

Freundliche Grüße vom marabu

chaosben 28. Nov 2005 11:48

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
Ich gebe zu, das ich nicht den ganzen Thread gelesen habe. Aber ich denke, das es Arbeitsspeicher (und Rechenzeit) spart, wenn du die Datei als TFileStream öffnest und in diesem Stream nach der gewünschten Bytefolge suchst.

... und ich denke Marabu hat recht. :stupid:

Totti 28. Nov 2005 12:05

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
Okay, also nochmal von vorne:
Es handelt sich nicht um ein Geheimobjekt :)

Es geht mir darum, aus den Datenbankdateien eines Spiels (hier der FussballManager von EA) bestimmte Informationen herauszusuchen, zu ersetzen, etc. Da ich verschiedenste Anwendungsbereiche im Auge habe, möchte ich eine möglichst allgemeingehaltene Lösung, auch wenn diese evtl. für diverse Anforderungsbereiche nicht immer optimal die Anforderungskritierein erfüllen.
Die Datenbank-Dateien sind ganz normale Textdateien, die die verschiedensten Daten eines Landes (Spieler(-name, alter, -etc), Mannschafts(-name,-farbe,-etc)) getrennt durch Zeilenumbrüche enthalten. Zudem existiert eine Indexauteilung durch Zeilen der Sytax "%index%playerX" u.ä., die dem Spieleigenen Editor zum Einlesen dienen, mir jedoch auch manchmal bei der Suche behilflich sind.

Die Operationen, die ich gerne ausführen möchte sind
a) ganz simpel einfach die Daten durchgehen und bestimmte Informationen abgreifen (auslagern, etc.)
b) die Daten durchgehen, bestimmte Dinge auslagern und hierauf basierend in der Quelldatei wieder andere Daten (Zeilen) ändern

Ganz wichtig ist halt, dass die Quelldatei logischerweise in ihrem nativen Format bestehen bleiben muss, damit der spieleigene Editor sie weiterhin einlesen kann. Zudem ist es sicherlich sinnvoll zu erwähnen, dass die Schreibvorgänge nicht immer nur vor oder direkt hinter dem Dateizeiger stattfinden, sondern auch gerne mal genau 67 Zeilen vorher o.ä.



Ich hoffe, dass diese Beschreibung mehr bringt und ihr evtl. noch was spezielles vorschlagen kann. Ansonsten dürfte ein array meine Anforderungen eigtl. erfüllen.
Bei dem TFileStream ist das Problem, das ich persönlich sehe, dass man den gesamten nachfolgenden Text um die Anzahl der Zeichen verschieben muss, die man in einer Zeile einfügt.


Nochwas zum Umfang der Operationen:
Die einzelnen DB-Dateien (diese im Textformat) haben einen Umfang von 2KB und 300 Zeilen bis zu 3,6MB und 600000 Zeilen
und es kann passieren, dass ich verteilt auf 206 Dateien bei mehr als 100.000 Spielerabschnitten jeweils 2-3 Datenzeilen auslesen/ändern muss/möchte.

marabu 28. Nov 2005 20:07

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
Unter Syntax verstehe ich eine EBNF oder eine vergleichbare Notation, aber lass nur...

Du willst z.B. Spielerprofile in der Textdatenbank aktualisieren und wenn du einen Spieler hinzufügst oder entfernst, dann musst du die bereits überlesenen internen Verwaltungsinformationen, wie z.B. die Größenangabe für die Spieler-Liste, korrigieren - sehe ich das richtig?

Ich vermute, dass EA einen Editor für solche Zwecke anbietet. Dieser wird das so handhaben, wie ich bereits vorgeschlagen habe: er wird eine intelligente interne Speicherstruktur verwenden, die im Wesentlichen den Speicherbedarf minimieren und die Manipulation vereinfachen sollte. Wenn du den Aufbau der Textdatenbank kennst, dann solltest auch du in der Lage sein eine entsprechende Speicherstruktur zu entwerfen.

marabu

Totti 29. Nov 2005 15:15

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
Hi,
die Dinge, die ich mit meinem Programm mache, deckt der EA-Editor nicht ab - deshalb schreib ich mir ja nen Programm ;)
Geht größtenteils um automatisierungsprozesse ... das hinzufügen/erstellen von Spielerdaten lässt sich mit dem Edi wesentlih einfacher gestalten, da hast du zweifelsohne Recht.

Da ich aber nur ca. 5% (wenn überhaupt) der zur Verfügung stehendes Daten eines Spielers "zu Rate" ziehe, ist die Frage, ob es sich lohnt, sämtliche Daten einzulesen und zwischenzuspeichern. So wie ich dich verstanden habe soll ich mir ja ne interne Speicherstruktur anlegen, alle Daten dareinlesen und diese dann durchsuchen.


hmmm ... das wäre natürlich ziemlich viel Aufwand, diese Speicherstruktur anzulegen, auch wenn damit dann recht viel möglich wäre.
Eigentlich wollte ich ja nur möglichst fix, die Dateien durchscannen und mir net gleich ne komplett eigene Datenbank im SPeicher anlegen :D

axelf98 29. Nov 2005 15:37

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
Falls du es nicht schon weißt:
Bei TStringlist hilft es, wenn man vor dem Durchlaufen und Schreiben ein

Delphi-Quellcode:
MeineListe.BeginUpdate;
und zum Schluss

Delphi-Quellcode:
MeineListe.EndUpdate;
schreibt...

Totti 1. Dez 2005 17:06

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
hab ich mal tickmäßig durchgecheckt, hat irgendwie nicht wirklich was gebracht .... hab im Netz allerdings gelesen, dass es was bei sichtbaren objekten, die auf tstrings zurückgreifen halt was brinbgen soll, weil er in de rzeit wohl net updated (das sichtbare) o.ä.
Trotzem danke, ich lern gern neues dazu ...


deshalb auch an marabu und chaobsen die frage, ob von euch noch was kommt ... :???: :)

marabu 1. Dez 2005 18:08

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
Hallo Malte.

Solange ich keine Syntax-Beschreibung von der text database habe, kann ich den Aufwand für das Design einer optimierten internen Speicherstruktur nicht abschätzen. Ich bleibe aber bei meiner Einschätzung, dass die Struktur nicht zu komplex sein kann - bis du mich eines besseren belehrst.

Vorweihnachtliche Grüße vom marabu

mimi 3. Dez 2005 17:57

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
@Totti
damit meine ich vor jeder zeiler schreibst du die größer dann kannst du schneller von zeile zu zeile zu springen d.h. wenn ich erst den zeilenumbruch suchen muss dauert es doch länger als wenn ich die länge schon vohrer weiß oder ?
da du die zeieln anzahl nicht veränderst ist dein vorhaben recht schnell mit TFileStream gelöst:
öffnest die datei springt zur geünwschten zeieln index bzw. suchst ihn oder wie auch immer.
ließs die zeile ein vergleichst sie evlt. dann ersetzt du diese zeile mit leerzeichen setzt die position wieder zurück und schreibst denn neuen innhalt wieder in die neue zeile mit zeieln anzahl !!!

Ist aber mit TFileStream ganz einfach mit etwas übung *G*

Totti 4. Dez 2005 10:16

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
@marabu,
allein die Eigenschaften eines einzelnen Spielers nehmen mehr als 200 Zeilen und damit Eigenschaften ein, hinzukommen halt die Eigenschaften der ganzen Vereine, des Landes, der Trainer, der Nationalmannschaft, der Stadien ... etc


@mimi,
Würdest du also erst die Datei einlesen und in ne tmpDatei neuschrieben, wobei vor jeder Zeile deren Länge steht?
Anschließend diese tmpDatei dann zeilenweise einlesen und wiederum in eine neue Datei schreiben, wobei vor dem letzten Schreibvorgang die evtl. gewünschten Änderungen an der zwischengespeicherten Zeile vorgenommen würden?

mimi 4. Dez 2005 10:25

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
wenn du die zeilanzahl nicht veränder brauchst du kein temp datei.
du kansnt einfach die aktuelle zeile mit leerzeichen fühllen(du hast ja die alte zeielnlänge)
und schreisbt zuerst die anzahl dann ein trenner z.b. der : und dann den eigetnlichen text.

du braucht wirklich keine datei neu zu erezugen das muss du nur machen wenn du die zeilenanzahl verändern möchtes. da du das nicht machst brauchst du auch keine neue Datei zu erzeugen !
z.b. so

Zitat:

40:Hallo die ist ein Text
30:dier Text soll 30 zeichen haben
4:Hier sind 4 zeichen drin
und soweiter
wenn du jetzt 40+30 rechnest hast du den zeilenanfang der 3 zeile....

ich hoffe das hat dir weiter geholfen wenn nicht. schreibe ich evlt. ein kleines beispiel !

Totti 4. Dez 2005 11:05

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
Und was mach ich, wenn ich die Zeile verlängern muss?
Statt '203948029438' nen '7 ' rienzusetzen ist ja ohne großes verschieben gemacht, richtig.
Aber aus ner '7' ne '203948029438' machen?!?

danke

p.s.: das mit den zeilenlängennummerierungen habsch geblickt, glaubsch ;)

marabu 4. Dez 2005 11:30

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
Moin.

Zitat:

Zitat von Totti
allein die Eigenschaften eines einzelnen Spielers nehmen mehr als 200 Zeilen und damit Eigenschaften ein, hinzukommen halt die Eigenschaften der ganzen Vereine, des Landes, der Trainer, der Nationalmannschaft, der Stadien ... etc

Das hat keinen direkten Einfluß auf die Komplexität - die erhöht sich nur durch Abhängigkeiten und Regeln. Aber wenn du glaubst, dass das Massieren der Textdatei ausreichend ist - wer bin ich, dass ich dir da widersprechen könnte.

Sonntagsgrüße vom marabu

tigerman33 4. Dez 2005 11:54

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
@marabu:
Vielleicht kriegst du deine BNF, wie du nochmal kurz erklärst, wie sie funktioniert (die BNF, meine ich)... :wink:

@Totti:
Schöne Grüße nach Harrislee! Hab bis Juli selbst in Flensburg gewohnt.

mimi 4. Dez 2005 14:07

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
 
@Totti
ganz einfach: du fühllst die geünschte zeile mit Leerzeichen und schreibst die neue zeieln länge + den neuen Text rein. mehr ist das in deinen fall garnicht !


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:10 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