Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi in stream nach Datum sortiert schreiben (https://www.delphipraxis.net/125832-stream-nach-datum-sortiert-schreiben.html)

bodenheim 12. Dez 2008 16:39


in stream nach Datum sortiert schreiben
 
Hallo,
ich habe hier ein Problem, komme nicht so richtig weiter.
Ich habe eine Datei, in der die Datensätze immer mit dem Datum beginnen. Danach der Wert.

Nun will ich neue Werte in den Stream schreiben, aber nach Datum sortiert an der richtigen Stelle.

Die Idee ist erstmal, nach dem Datum bzw. dem vorherigen zu suchen, aber einen String im stream zu suchen ist nicht so einfach..
wie macht man das am besten?
Wäre für Vorschlage dankbar.

Phoenix 12. Dez 2008 16:43

Re: in stream nach Datum sortiert schreiben
 
Wir brauchen dafür ein paar mehr Informationen über die Struktur der Daten.
Haben die eine Feste breite (wahrscheinlich nicht?), sind die durch CR/LF getrennt? (wenn ja: In TStringList laden und für jeden Eintrag in der TStringList das Datum vorne prüfen).

bodenheim 12. Dez 2008 16:51

Re: in stream nach Datum sortiert schreiben
 
Zitat:

Zitat von Phoenix
Wir brauchen dafür ein paar mehr Informationen über die Struktur der Daten.
Haben die eine Feste breite (wahrscheinlich nicht?),

nein

Zitat:

Zitat von Phoenix
sind die durch CR/LF getrennt? (wenn ja: In TStringList laden und für jeden Eintrag in der TStringList das Datum vorne prüfen).

ja.
So werde ich es wohl einmal versuchen, danke. Die Datumsposition im stream suchen und direkt dort schreiben geht wohl nicht?..

Phoenix 12. Dez 2008 17:05

Re: in stream nach Datum sortiert schreiben
 
geht schon...
Du musst aber sequentiell durchlaufen, und wenn Du die Sequenz CRLF findest das folgende Datum prüfen.

Das ist halt auch nicht wirklich elegant.

bodenheim 17. Dez 2008 10:30

Re: in stream nach Datum sortiert schreiben
 
hi, also ick werd noch verrückt..
ich habe einen stream aus einer Datei, die Werte beginnen immer mit einem Datum z.B.

20.09.2008, xyz
21.09.2008, abc
25.09.2008, rtf

nun habe ich neue Werte, die ich in diesen stream/Datei schreibe.
Einfach anhängen schaffe ich

Delphi-Quellcode:
Stream := TFileStream.Create(....,fmOpenReadWrite);
Stream.Seek(0,soFromEnd);
Stream.write(...);
wie aber wenn ich einen Wert 24.09.2008 habe, wie schreibe ich den an die richtige Stelle im stream?
Muss unbedingt nach Datum sortieren. Wie schreibt man im stream nach Datum sortiert an die richtige Stelle?

Wäre für Hilfe dankbar..

DeddyH 17. Dez 2008 10:34

Re: in stream nach Datum sortiert schreiben
 
Wie Phoenix bereits meinte, ist ein Stream hier wohl nicht das Mittel der Wahl, dann eher irgend eine Liste (TStringList).

bodenheim 17. Dez 2008 11:11

Re: in stream nach Datum sortiert schreiben
 
Zitat:

Zitat von DeddyH
Wie Phoenix bereits meinte, ist ein Stream hier wohl nicht das Mittel der Wahl, dann eher irgend eine Liste (TStringList).

der springende Punkte ist, dass ich nicht immer die gesamte Datei einlesen will,
die ziemlich gross ist,
wenn ich z.B. nur einen einzigen neuen Datensatz habe, der eben nur an die richtige Stelle muss..

Geschwindigkeit ist der Punkt.
Sonst könnte ich natürlich immer die gesamte Datei lesen, und die gesamte Datei zurückschreiben.
Ist aber blödsinnig, weil ich meist nur einen einzigen neuen Datensatz habe, der eben
vom Datum her an die richtige Stelle muss

DeddyH 17. Dez 2008 11:13

Re: in stream nach Datum sortiert schreiben
 
Die Frage ist aber, wie Du die Datensätze im Stream auseinanderhalten willst, wenn diese nicht dieselbe Länge aufweisen.

[edit] Ein FileStream liest doch auch die gesamte Datei, oder irre ich mich? [/edit]

bodenheim 17. Dez 2008 11:28

Re: in stream nach Datum sortiert schreiben
 
Zitat:

Zitat von DeddyH
Die Frage ist aber, wie Du die Datensätze im Stream auseinanderhalten willst, wenn diese nicht dieselbe Länge aufweisen.

[edit] Ein FileStream liest doch auch die gesamte Datei, oder irre ich mich? [/edit]

ich baue auf ein bestehendes Projekt auf;
was kein Problem ist ist z.B., alle Daten zu lesen,
in ein ListView zu parsen
und dann mit Alphasort alles zu sortieren und dann zurückzuschreiben.

Das dauert mir eindeutig zu lange, wenn ich z.B. nur einen neuen Datensatz habe, der an die richtige Stelle muss.
Wäre völlig unsinnig.

Jetzt probiere ich einmal, alles in eine TStringList zu lesen u.sortieren, geht vielleicht schneller.
Bitte beachten dass ich eben kein Profi bin :) , privates Projekt.
Deshalb die Fragen.

Hawkeye219 17. Dez 2008 11:36

Re: in stream nach Datum sortiert schreiben
 
Hallo bodenheim,

warum verwaltest du nicht einen zusätzlichen Index ("Inhaltsverzeichnis"), der neben dem Datum auch die Position der eigentlichen Nutzdaten im Stream enthält? Dieser Index könnte in einer weiteren Datei oder am Ende des bestehenden Streams liegen. Beim Hinzufügen eines neuen Datensatzes gehst du dann wie folgt vor:

1. Index einlesen (z.B. in eine TStringList)
2. Neuen Datensatz hinter die bisherigen Nutzdaten schreiben
3. Verwaltungsdaten für den neuen Datensatz in den Index einfügen (Datum und Position im Stream)
4. Index hinter den neuen Datensatz schreiben

Bei dieser "chaotischen" Verwaltung stehen die eigentlichen Nutzdaten zwar unsortiert im Stream, du kannst aber über den Index jederzeit eine beliebige Sortierung herstellen. Auf diese Weise musst du nur eine relativ kleine Datenmenge beim Erweitern der Datei lesen und schreiben. Auch beim eventuellen Löschen von Datensätzen bietet diese Vorgehnsweise einen Vorteil, da die zu löschenden Datensätze nur im Index als "gelöscht" markiert werden müssen. Bei einem späteren Bereinigungslauf kann dann der komplette Stream (ohne die gelöschten Datensätze) neu geschrieben werden.

Du kannst natürlich auch gleich auf eine "richtige" Datenbank (SQLite?) ausweichen...

Gruß Hawkeye


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