AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi in stream nach Datum sortiert schreiben
Thema durchsuchen
Ansicht
Themen-Optionen

in stream nach Datum sortiert schreiben

Ein Thema von bodenheim · begonnen am 12. Dez 2008 · letzter Beitrag vom 17. Dez 2008
Antwort Antwort
bodenheim

Registriert seit: 9. Mär 2008
73 Beiträge
 
#1

in stream nach Datum sortiert schreiben

  Alt 12. Dez 2008, 17:39
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.
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#2

Re: in stream nach Datum sortiert schreiben

  Alt 12. Dez 2008, 17:43
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).
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
bodenheim

Registriert seit: 9. Mär 2008
73 Beiträge
 
#3

Re: in stream nach Datum sortiert schreiben

  Alt 12. Dez 2008, 17:51
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 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?..
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#4

Re: in stream nach Datum sortiert schreiben

  Alt 12. Dez 2008, 18:05
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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
bodenheim

Registriert seit: 9. Mär 2008
73 Beiträge
 
#5

Re: in stream nach Datum sortiert schreiben

  Alt 17. Dez 2008, 11:30
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..
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#6

Re: in stream nach Datum sortiert schreiben

  Alt 17. Dez 2008, 11:34
Wie Phoenix bereits meinte, ist ein Stream hier wohl nicht das Mittel der Wahl, dann eher irgend eine Liste (TStringList).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
bodenheim

Registriert seit: 9. Mär 2008
73 Beiträge
 
#7

Re: in stream nach Datum sortiert schreiben

  Alt 17. Dez 2008, 12:11
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#8

Re: in stream nach Datum sortiert schreiben

  Alt 17. Dez 2008, 12:13
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]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
bodenheim

Registriert seit: 9. Mär 2008
73 Beiträge
 
#9

Re: in stream nach Datum sortiert schreiben

  Alt 17. Dez 2008, 12:28
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.
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#10

Re: in stream nach Datum sortiert schreiben

  Alt 17. Dez 2008, 12:36
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
  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 02:02 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