![]() |
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. |
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). |
Re: in stream nach Datum sortiert schreiben
Zitat:
Zitat:
So werde ich es wohl einmal versuchen, danke. Die Datumsposition im stream suchen und direkt dort schreiben geht wohl nicht?.. |
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. |
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:
wie aber wenn ich einen Wert 24.09.2008 habe, wie schreibe ich den an die richtige Stelle im stream?
Stream := TFileStream.Create(....,fmOpenReadWrite);
Stream.Seek(0,soFromEnd); Stream.write(...); Muss unbedingt nach Datum sortieren. Wie schreibt man im stream nach Datum sortiert an die richtige Stelle? Wäre für Hilfe dankbar.. |
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).
|
Re: in stream nach Datum sortiert schreiben
Zitat:
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 |
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] |
Re: in stream nach Datum sortiert schreiben
Zitat:
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. |
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 10:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz