Soriter-Funktion()...
-
Hallo,
folgendes Problem:
ich muss eine LOG-Datei, die wie folgt aufgebaut ist:
/ Datum+Uhrzeit Username Ereigniss(enthält auch Leerzeichen) /
auslesen, alle Nach Username und Datum aufsteigend sortieren und wieder
in eine Datei reinschreiben (egal ob eine neue oder nicht)!
wie gehe ich da am besten vor???
bitte helft mir !!!
-
Sofern Datum+Uhrzeit und Username keine Leerzeichen o.ä. enthalten, also die Datei immer ungefähr so aufgebaut ist:
29.01.2005 11:45 Administrator Admin hat sich eingelogged | | | | Datum Uhrzeit User Message
Dann kannst du Datum, Uhrzeit und Username doch per cin >> var einlesen. Danach per getline(cin, msg); den Rest der Zeile (mit dem Ereignis) einlesen.
Danach sortieren.Caipi
-
wie kann ich den nach Datum am besten sortieren???
gibt es ein Funktion dafür???
-
Kommt darauf an, welches Format das Datum besitzt. Am besten wäre es wohl eine Klasse Date zu schreiben, die das Datum als string empfängt (o.ä.) und diesen dann in entsprechende Datenelemente umwandelt. Danach noch eine isLess-Vergleichsfunktion reinbauen (oder halt den < Operator überladen) und du kannst Daten wunderbar vergleichen.
Kann auch sein, dass es bereits vorgefertige Funktionen dafür gibt. Diese sind mir allerdings nicht bekannt.
Caipi
-
wie wärs, sich die sekunden mitzuloggen und dann einfach sortieren?
-
client schrieb:
wie kann ich den nach Datum am besten sortieren???
gibt es ein Funktion dafür???Das hängt doch alles von einer vernünftigen Datenstruktur ab! Man kann Datum als struct/class definieren oder als Einzelvariable. Geschickt und zuverlässig ist die Umwandlung in string in der Form: "20050129". Das lässt sich gut mit den üblichen Sortieralgos (BubbleSort, Quicksort) machen.
Gruss Jerry
-
client schrieb:
wie kann ich den nach Datum am besten sortieren???
gibt es ein Funktion dafür???Das hängt doch alles von einer vernünftigen Datenstruktur ab! Man kann Datum als struct/class definieren oder als Einzelvariable. Geschickt und zuverlässig ist die Umwandlung in string in der Form: "20050129". Das lässt sich gut mit den üblichen Sortieralgos (BubbleSort, Quicksort) machen.
Gruss Jerry
-
Caipi schrieb:
Kommt darauf an, welches Format das Datum besitzt. Am besten wäre es wohl eine Klasse Date zu schreiben, die das Datum als string empfängt (o.ä.) und diesen dann in entsprechende Datenelemente umwandelt. Danach noch eine isLess-Vergleichsfunktion reinbauen (oder halt den < Operator überladen) und du kannst Daten wunderbar vergleichen.
mal schauen.
29.01.2005 11:45
ich würde gerne mit zweierpotenzen plutimitieren. und das horner-schewma nutzen. also
x=((((2005)?+1)?+29)?+11)?+45;
also
x=((((2005)*16+1)*32+29)*32+11)*64+45;
wie großt wird das denn?
x=2102520557;
ist ein wenig groß.
x=((((2005-1900)*16+1)*32+29)*32+11)*64+45;
x=110226157;
jo, das ist fein. so kannste die daten recht flott zu integers machen, die beim vergleich extrem schnell sind und die gleichen resultate zeitigen, wie die ursprünglichen daten.
-
Das genaue Format der Datei ist immer nützlich.
Logdateien haben normalerweise die Eigenschaft, dass die Einträge schon zeitlich sortiert sind. Dann muss man nur noch einen stable_sort nach den Usernamen machen und schon hat man eine username + datum Sortierung der Einträge. Ist zum Beispiel der username das 5te Feld in einer Zeile geht das ganze einfach so:
sort -k 5 --stable datei.log