![]() |
Sortierung von Daten in Textdateien
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!? :wall: 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 |
Re: Sortierung von Daten in Textdateien
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 |
Re: Sortierung von Daten in Textdateien
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; |
Re: Sortierung von Daten in Textdateien
Zitat:
Zitat:
Zitat:
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 |
Re: Sortierung von Daten in Textdateien
also so schwer ist das doch garnicht?
(falls ich mich jetzt nicht vertan hab)
Delphi-Quellcode:
es ließe sich auch noch sehr leicht ein Offset einbauen, z.B. die vorletzen 15 Einträge (16-30)
// 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; |
Re: Sortierung von Daten in Textdateien
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 |
Re: Sortierung von Daten in Textdateien
@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:
und die dazugehörigen Äußerungen
24.10.09;12:26;Datum/Uhrzeit verstellt <=== 24.10.09 KEIN Tippfehler!!!
24.08.09;13:04;Datum/Uhrzeit verstellt |
Re: Sortierung von Daten in Textdateien
Zitat:
Zitat:
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 |
Re: Sortierung von Daten in Textdateien
Hallo,
ich meinte natürlich CustomSort. Wo ist das Problem damit, eine eigene Sortier-Routine (genauere Compare-Methode) zu schreiben ? Heiko |
Re: Sortierung von Daten in Textdateien
Hallo zusammen,
da hier inzwischen wieder ein paar Antworten kamen, mal eine Zusammenfassung dieser nebst Antworten meinerseits. Zitat:
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. :gruebel: Gruß, Carsten |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:38 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