AGB  ·  Datenschutz  ·  Impressum  







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

Sortierung von Daten in Textdateien

Ein Thema von Carsten1234 · begonnen am 28. Aug 2009 · letzter Beitrag vom 1. Sep 2009
Antwort Antwort
Seite 1 von 2  1 2      
Carsten1234

Registriert seit: 9. Apr 2008
Ort: Vechelde
178 Beiträge
 
Delphi 8 Professional
 
#1

Sortierung von Daten in Textdateien

  Alt 28. Aug 2009, 10:48
Hallo zusammen,

aus einem Gerät sollen mehrere Textdateien aus einem Gerät ausgelesen und in einer Tabelle dargestellt werden. Diese Dateien heissen "ereignisse.csv", "ereignisse.ba0".."ereignisse.ba9"; in jeder dieser Textdateien befinden sich max. 500 Zeilen ("Datensätze").
Zuerst werden vom Gerät anfallenden Ereignisse in die Datei "ereignisse.csv" geschrieben und wenn diese Datei ihre 500 Datensätze erreicht hat, wird sie umbenannt in "ereignisse.ba0". Im Anschluss daran wird eine neue Datei "ereignisse.csv" im Gerät erzeugt. Existiert bereits eine Datei "ereignisse.ba0", so wird zunaächst diese Datei in "ereignisse.ba1" umbenannt, dann die "ereignisse.csv" in "ereignisse.ba0".

Der Inhalt diese Dateien ist (Bsp.):

ereignisse.ba0
==============
23.08.09;11:35;
23.08.09;11:37;
23.08.09;12:13;
23.08.09;14:27;
(...)
24.08.09; 11:17;

ereignisse.csv
==============
24.08.09;11:19;
24.10.09;12:26;Datum/Uhrzeit verstellt <=== 24.10.09 KEIN Tippfehler!!!
24.08.09;13:04;Datum/Uhrzeit verstellt
24.08.09;13:38;


Angezeigt werden an der Oberfläche sollen die Ereignisse in absteigender Reihenfolge, also das jüngste Ereignis ganz oben. Bislang war das auch kein Problem, denn ich las die ereignisse-Dateien einfach ein und sortierte absteigend nach Datum/Uhrzeit.
Nun jedoch viel auf (weil man im Gerät auch Datum/Uhrzeit von meinem Programm aus verstellen kann), dass die Sortierung nach Datum/Uhrzeit nur noch bedingt richtig ist, denn - und jetzt komme ich zum 24.10.09 da oben - bei der Sortierung nach Datum/Uhrzeit bleibt der Eintrag vom 24.10.09 so lange oben in meiner Liste stehen, bis das Gerät den 24.10.09 wieder erreicht bzw. überschritten hat. Lt. Ereignisliste dort oben hatte der Anwender zunächst das Datum vorgestellt auf den 24.10.09 und im nächsten Schritt wieder zurück gestellt auf den 24.08.09.

Kurzum: Man möchte die Anzeige nun so, wie sie in den Ereignissdateien wirklich stehen mit dem jüngsten Ereignis ganz oben. Ich darf den Mist nun ausbaden und überlege wie!?
Das kleine Schmankerl dabei: Die Daten (Ereignis-Dateien) kommen nacheinander und byteweise in max. 4k-Blöcken über die serielle Schnittstelle aus dem Gerät.
Bisher hatte ich es so gemacht, dass ich den Datenstrom aus dem gerät erstmal direkt in eine TMP-Datei auf HDD zwischenspeicherte, um nach der Übertragung die TMP-Datei einzulesen. Dies hatte nicht nur den schicken Vorteil, dass in der TMP-Datei die Daten bzw. Datensätze wieder zeilenweise so wie im Gerät vorlagen, sondern auch die Reihenfolge in der Datei erstmal völlig unerheblich war, weil ich ja die Sortierkriterien Datum&Uhrzeit hatte und danach sortieren konnte.

Frage: Hat jemand eine Idee, wie ich die neu gewünschte Sortierreihenfolge am besten hinbekommen?

Dank vorab und Gruß, Carsten
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Sortierung von Daten in Textdateien

  Alt 28. Aug 2009, 10:57
Hallo,

eine weiterer Fall für James TStringList

Lade die Daten per LoadFromFile rein,
sortiere sie selber im Speicher um
(intern über Explode oder Separator).
(Sort gibt es bereits)

und speichere sie ab.


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Sortierung von Daten in Textdateien

  Alt 28. Aug 2009, 11:18
Sort ging ja nicht, da er ja nicht nach Datum sordieren will

es gibt nun 2 Lösungen:

* entweder du läßt die Reinfolge in der Datei und Zeigst die Liste nur andersrum an (also in der Anzeige die letzte Zeile nach oben und usw.

* oder du drehst die Zeilen in der Datei um
Delphi-Quellcode:
For i := 0 to SL.Count div 2 - 1 do Begin
  S := SL[i];
  SL[i] := SL[SL.Count - i - 1];
  SL[SL.Count - i - 1] := S;
End;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Carsten1234

Registriert seit: 9. Apr 2008
Ort: Vechelde
178 Beiträge
 
Delphi 8 Professional
 
#4

Re: Sortierung von Daten in Textdateien

  Alt 28. Aug 2009, 11:48
Zitat von himitsu:
Sort ging ja nicht, da er ja nicht nach Datum sordieren will
Ich will schon, nur andere wollen nicht mehr.

Zitat von himitsu:
* entweder du läßt die Reinfolge in der Datei und Zeigst die Liste nur andersrum an (also in der Anzeige die letzte Zeile nach oben und usw.
Scheidet aus, da man die jüngste Zeile oben haben will.

Zitat von himitsu:
* oder du drehst die Zeilen in der Datei um
Klappt auch nicht so, denn wenn ich mit der Datei "ereignisse.csv" beginne und mich dann nach hinten "durchhangele", dann habe ich die Reihenfolge
24.08.09;11:19;
24.10.09;12:26;
24.08.09;13:04;
24.08.09;13:38;
23.08.09;11:35;
23.08.09;11:37;
23.08.09;12:13;
23.08.09;14:27;
(...)
24.08.09; 11:17;

Nun kann man sagen, fange mit der letzten Datei an, aber:
Auf der einen Seite will man nur die letzten 15 jüngsten Ereignisse sehen und auf einer anderen Seite ALLE Ereignisse (immer das jüngste Ereignis oben). Wenn ich alle anzeigen soll, mag das noch so gehen mit hinten anzufangen auszulesen, doch ich will mir ja nicht alle 11 Dateien mit je max. 500 Datensätzen reinzwirbeln, wenn ich nur die jüngsten 15 Ereignisse anzeigen soll. Ein netter Nebeneffekt dabei ist noch, dass in der Datei "ereignisse.csv" nur 14 Datensätze liegen und ich dann noch den 15. Datensatz aus der Datei "ereignisse.ba0" auslesen muss.
Und jetzt kann auch noch folgendes passieren (für die Kurzanzeige mit 15 Datensätzen):
In der Datei "ereignisse.csv" liegen 10 Datensätze ==> Datei "ereignisse.ba0" auch auslesen. In dieser Datei sind aber nur (warum auch immer, kann aber passieren) 3 Datensätze, macht zusammen 13 Datensätze. Ich brauche aber mind. 15 Datensätze, also auch noch die Datei "ereignbisse.ba1" auslesen.
Du siehst die Krux...

Gruß, Carsten
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Sortierung von Daten in Textdateien

  Alt 28. Aug 2009, 12:00
also so schwer ist das doch garnicht?
(falls ich mich jetzt nicht vertan hab)
Delphi-Quellcode:
// Anzahl, i: Integer;
// Eintraege, SL: TStringList;
// Dateiname, S: String;

// Eintraege = deine Liste
// Dateiname = 'ereignisse' (natürlich inkl. Verzeichnis ;) )
// Anzahl = die gewünschten Zeilen (für alles einfach auf MaxInt setzen)

Eintraege.Clear;
i := -1;
While Eintraege.Count < Anzahl do Begin
  If i < 0 Then S := '.csv'
  Else If i < 10 Then S := '.cs' + IntToStr(i)
  Else S := '.c' + IntToStr(i);
  If not FileExists(Dateiname + S) Then Break;
  SL.LoadFromFile(Dateiname + S);
  SL.AddStrings(Eintraege);
  Eintraege.Assign(SL);
  Inc(i);
End;
While Eintraege.Count > Anzahl do Eintraege.Delete(0);
For i := 0 to Eintraege.Count div 2 - 1 do Begin
  S := Eintraege[i];
  Eintraege[i] := Eintraege[Eintraege.Count - i - 1];
  Eintraege[Eintraege.Count - i - 1] := S;
End;
es ließe sich auch noch sehr leicht ein Offset einbauen, z.B. die vorletzen 15 Einträge (16-30)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

Re: Sortierung von Daten in Textdateien

  Alt 28. Aug 2009, 12:09
hallo carsten,

meine Bemerkung zu dem Versuch ein deutsches Datum zu sortieren spar ich mir mal.

Wenn ich das richtig verstanden habe, dann trödeln bei Dir immer irgendwelche Datensätze ein, die von jwd kommen. Diese Datensätze enthalten Daten, die einem Datum und einer Uhrzeit ähnlich sehen, aber für Dich vollkommen irrelevant sind.
Verpaß den eingehenden Daten doch soetwas wie einen Zeitstempel. Dann hast Du eine zuverlässige Information wann die Daten bei Dir eingegangen sind. Mit dieser Information organisierst Du dann die eigentliche Verarbeitung.

Wenn möglich solltest Du die Aufteilung auf mehrere Dateien überdenken, das erscheint mir wie ein Relikt aus Diskettenzeiten.

Gruß
K-H

oh roter kasten

über records ist die Verarbeitung etwas "sauberer" als mit Stringlisten
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Sortierung von Daten in Textdateien

  Alt 28. Aug 2009, 12:12
@p80286: Das mit dem Zeitstempel ist gut, aber welchen willst du denn nehmen?
Der vom System/PC ist ja vollkommen aussageunkräftig, daa dieser sich ja auch
mal ändern kann ... siehe
Delphi-Quellcode:
24.10.09;12:26;Datum/Uhrzeit verstellt <=== 24.10.09 KEIN Tippfehler!!!
24.08.09;13:04;Datum/Uhrzeit verstellt
und die dazugehörigen Äußerungen
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

Re: Sortierung von Daten in Textdateien

  Alt 28. Aug 2009, 13:26
Zitat von himitsu:
@p80286: Das mit dem Zeitstempel ist gut, aber welchen willst du denn nehmen?
Der vom System/PC ist ja vollkommen aussageunkräftig, daa dieser sich ja auch
mal ändern kann ... siehe
Delphi-Quellcode:
24.10.09;12:26;Datum/Uhrzeit verstellt <=== 24.10.09 KEIN Tippfehler!!!
24.08.09;13:04;Datum/Uhrzeit verstellt
und die dazugehörigen Äußerungen
Zitat:
Nun jedoch viel auf (weil man im Gerät auch Datum/Uhrzeit von meinem Programm aus verstellen kann), dass..
Ich hab das so verstanden, daß die "Zeit" von dem externen System generiert wird. Also die Empfängerzeit zuverlässig ist. Ansonsten ein simpler Zähler würde auch reichen, wenn die Abstände der eingehenden Nachrichten nicht dokumentiert werden müssen. Wenn der Empfänger jeden Tag gebootet wird könnte man sogar den Timertick verwenden, dann hat man eine Reihenfolge und die Abstände des Nachrichteneingangs.

Wenn das nicht geht, dann eben umgekehrt auslesen, wie Du vorgeschlagen hast, obwohl, wenn während des Auslesens neue Daten herein kommen?? Darum mißtraue ich auch der Aufteilung auf mehrere Dateien.

Gruß
K-H
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Sortierung von Daten in Textdateien

  Alt 28. Aug 2009, 14:43
Hallo,

ich meinte natürlich CustomSort.

Wo ist das Problem damit,
eine eigene Sortier-Routine (genauere Compare-Methode) zu schreiben ?


Heiko
Heiko
  Mit Zitat antworten Zitat
Carsten1234

Registriert seit: 9. Apr 2008
Ort: Vechelde
178 Beiträge
 
Delphi 8 Professional
 
#10

Re: Sortierung von Daten in Textdateien

  Alt 31. Aug 2009, 07:43
Hallo zusammen,

da hier inzwischen wieder ein paar Antworten kamen, mal eine Zusammenfassung dieser nebst Antworten meinerseits.

Zitat von p80286:
Wenn ich das richtig verstanden habe, dann trödeln bei Dir immer irgendwelche Datensätze ein, die von jwd kommen.
Jein. Es trödeln keine Datensätze bei mir ein, sondern ich frage in einem Intervall x nach den Datensätzen. Mit anderen Worten: Nicht das Gerät spricht mit mir, sondern ich mit dem Gerät. Stell Dir am besten vor, das Gerät wäre der Server und mein Programm der Client. So lange ich keine Anfragen an das Gerät stelle, ist dieses stumm.
Das Gerät wiederum speichert alle Ereignisse in den genannten CSV-Dateien "ereignisse.csv", "ergeignisse.ba0" usw., was ja nix anders ist als simple Textdateien. Ich sage dem Gerät "Gib mir mal die Datei ereignisse.csv", woraufhin es mir den Inhalt der Datei als Bytestrom liefert (serielle Datenübertragung). Ein Zeitstempel auf meiner Seite ist somit unmöglich.

@himitsu: Deinen Code werde ich mir mal anschauen, allerdings befürchte ich jetzt schon, dass er mich nicht viel weiter bringt.

Meine Idee übers WoEn war:
Jeder Datensatz enthält die gleiche Anzahl Semikolons, so dass ich diese im Bytestrom mitzählen kann. Ist nun ein kompletter Datensatz auf meiner Seite eingetroffen, setze ich, bevor ich die Daten auf HDD zwischenspeichere, ans Ende eines jeden Datensatzes "Indexe".
Diese definieren sich wie folgt:
Dateiindex: Die erste Datei "ereignisse.csv" hat den Index 0, die Datei "ereignisse.ba0" den Index 1 usw.
Datensatzindex: Pro Datensatz setze ich einen Datensatzzähler und erhöhe ihn je Datensatz.
Um das an den Beispieldaten oben zu verdeutlichen:

ereignisse.csv
==============
24.08.09;11:19;...;0;1;
24.10.09;12:26;...;0;2;
24.08.09;13:04;...;0;3;
24.08.09;13:38;...;0;4;

Dateiindex: 0
Datensatzindex: 1..4

ereignisse.ba0
==============
23.08.09;11:35;...;1;5;
23.08.09;11:37;...;1;6;
23.08.09;12:13;...;1;7;
23.08.09;14:27;...;1;8;
24.08.09; 11:17;..;1;9;

Dateiindex: 1
Datensatzindex: 5..9

Jetzt bräuchte ich nur noch einen geschickten Sortieralgorithmus, der absteigend nach Dateiindex und in diesem wiederum aufsteigend nach Datensatzindex sortiert.

Gruß, Carsten
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 12:52 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