Entwickler-Ecke

Sonstiges (Delphi) - Datum und Zeit in Log-Datei suchen, Sowas wie Stringformat


mega - Fr 12.05.06 09:19
Titel: Datum und Zeit in Log-Datei suchen, Sowas wie Stringformat
Hallo,
In einer Log-Datei sind Datum und Zeit gespeichert, z.B. so:
Date and Time: 04/19/06 23:12:28

Erkennbar wäre das am 'Date and Time:' und wenn man weiss, was danach wo steht.

Die Frage ist jetzt, ob man das etwas allgemeiner halten kann, damit der User es in einem Textfeld z.B. so eingeben kann: ' DD/NN/JJ HH:MM:SS' und delphi das dann auf mehrere Variablen oder gleich in TDateTime speichert.

Wo es anfängt lässt sich ja mit pos() von 'Date and Time:' ermitteln. Oder kann Delphi auch nach Mustern suchen (in der Windows-Suche würde das so aussehen: ' ??/??/?? ??:??:??')
? = beliebiges Zeichen, aber genau ein Zeichen.

Ich hab dazu noch function FormatDateTime(const Format: string; DateTime: TDateTime): string; gefunden. Das macht aus einem TDateTime einen Benutzerformatierten Strig. Gibts das auch andersrum? also TDateTime aus String und Format oder Einzelvariablen aus String und Format?


FFKangoroo - Sa 13.05.06 11:38

Also wenn ich dich richtig verstehe, dann hast du eine logdatei die nicht nur aus dem jeweiligen Datum besteht sondern so ähnlich wie ein ICQ Log (Datum +Text) ist und du willst dann zu einem belibigen datum springen? oder möchtest du zum nächsten datum springen wo du nicht weisst welches es ist?

bei ersterem wäre es so dass du einfach die Eingabe strickt vorgibst und dann suchen lässt. kannste zum beispiel mit mehrern edits machen wo dann halt zum einen der Tag, der Monat und das Jahr usw. reingeschriben werden. sollte meiner meinung nach kein problem sein.

(hmm wer lesen kann ist klar im vorteil ... :oops: )
beim zweiten kannst du vor das datum einfach eine Textmarke setzen wie: '?date?' (form ist ja egal hauptsache etwas was das nicht so im fliestext vorkommt) und lässt dann nacheinander die sachen suchen.

hmm was am kompliziertesten wäre wenn du dann zum beispiel nur nach dem monat suchen möchtest. hier wäre am einfachsten wenn du wirklich erstmal alles in einzelne editfelder aufteilst und vorher dann checkst ob sie leer und zahlen sind. dann machst du einfach die anweisungen, dass wenn er dann die Textmarke gefunden hat 3 zeichen weiter schauen soll ob auch der monat da ist.
kannst du aber auch in einem editfeld machen. da suchste dir vorher einfach eine variable aus wie zum beispiel die '??' oder einfach 'xx' und überprüfst vorher dann für welche stellen die stehen, und überspringst dann halt soviele wie da stehen(natürlich an den richtigen stellen)


Zweiter Versuch:
Also soweit ich weiss gibt es sowas nicht(ist mir zumindest noch nicht vorgekommen) die haben das wahrscheinlich auch selber programmiert, klingt auch nicht zu schwer. Das mit den Textmaken (bei dir dann 'Date and Time') lässt dich das datum finden was dan anhand der eingabe überprüft wird. Die Form die du vorgibst is ja dir überlassen. Aber um Anwendungsfehler in form ungültiger eingaben zu minimieren würd ich zu mehreren Edits greifen.

Hoffe es ist verständlich und hilft!

FFKangoroo

Moderiert von user profile iconraziel: Doppelposting entfernt.


mega - Sa 13.05.06 12:23

Das eigentliche Problem ist, das ich den Aufbau von Datum und Zeit nicht vorgeben will, damit das Programm möglichst universell wird.

Mit vorgegebenem Aufbau ist mir klar, wie ich es machen kann.


Horst_H - Sa 13.05.06 13:32

Hallo,

ist dies nicht der klassische Anwendungsfall fuer regulaere Ausdruecke:
http://regexpstudio.com/DE/TRegExpr/Help/About.html

Gruss Horst


FFKangoroo - Sa 13.05.06 13:34

hmm? also es kann sein dass das Datum mal so '13.05.2006' in der log steht oder mal so '13.5.06' ? wenn ja wo is der sinn? sollte wenn dann einheitlich sein.

Steht es aber immer in dem selben Format in der Log Datei und der Benutzer soll entscheiden wie er sucht, kannste es ja so machen:
Am einfachsten wieder mit mehreren editfeldern. jetzt musst du nur jede eingabe analysieren. Mit der stringlänge kannst du dir dann das Format zurecht suchen. und dann jeweils noch eine postion weiter suchen wenn die Führungsnull fehlt(oder halt 2 wenn die 20 im jahr fehlt.

Aber sei dir gewiss dass jedes bisschen individualität auf kosten der länge der prozedur geht.
Ich weiss zwar selber dass es oft der wunsch ist etwas allgemeingültiges zu schaffen, aber es ist meist nicht notwendig. Mein Rat wäre daher gib ein festes Format vor wenn du dir arbeit sparen willst


FFKangoroo - Sa 13.05.06 13:39

user profile iconHorst_H hat folgendes geschrieben:
Hallo,

ist dies nicht der klassische Anwendungsfall fuer regulaere Ausdruecke:
http://regexpstudio.com/DE/TRegExpr/Help/About.html

Gruss Horst


Hmm so wie ich das jetz auf die schnelle verstadnen habe ist das doch nur zum überprüfen ob eine eingabe der vorgegeben form entspricht oder nicht?

FFKangoroo


mega - Sa 13.05.06 13:52

user profile iconFFKangoroo hat folgendes geschrieben:
hmm? also es kann sein dass das Datum mal so '13.05.2006' in der log steht oder mal so '13.5.06' ? wenn ja wo is der Sinn? sollte wenn dann einheitlich sein.

Innerhalb einer Datei ist es einheitlich.
Aber in Dateien aus anderen Tests nicht.

Es handelt sich bei den Dateien um Ergebnisse aus einem automatischen Testsystem. Die Testmodule sind aber von verschiedenen Leuten geschrieben (nein, ich habe da erstmal keinen Einfluss drauf. Und die nächste Version irgenwann hat den Auswerter/Sucher gleich eingebaut).

Und wenn das Programm auf ein Log aus einem ganz anderen System losgelassen wird, ist das Problem wieder da.


jasocul - Sa 13.05.06 14:03

Eine automatische Analyse ist nicht möglich, Stelle dir vor, dass auch noch Tag und Monat vertauscht sind! Ich hatte einen ähnlichen Fall und habe dann im Programm die Möglichkeit hinterlegt, ein Profil zu erstellen.
Dort konnte dann der Aufbau des Datums eingestellt werden. Anhand dessen habe ich dann eine Analyse des Datums gemacht. Wenn es dann falsch war, hatte der Anwender Schuld. :mrgreen:

Theoretisch kann man das in gewissen Grenzen sicher automatisch analysieren. Aber bei folgender Konstellation sind eindeutig Grenzen gesetzt:
Zeitraum: 06.06.06 bis 07.06.06.
Jetzt versuche mal heraus zu bekommen, welcher Zeitraum tatsächlich gemeint ist. Ein Jahr, ein Tag oder ein Monat. Das Datum könnte folgende Formate haben: TT.MM.JJ, MM.TT.JJ, JJ.TT.MM, JJ.MM.TT.

Innerhalb der Log-Datei könnte man es vielleicht wieder feststellen, wenn für jeden Tag Daten drin stehen, aber es bleibt doch immer ein gewisses Rest-Risiko.


mega - Sa 13.05.06 14:13

user profile iconjasocul hat folgendes geschrieben:
Eine automatische Analyse ist nicht möglich, Stelle dir vor, dass auch noch Tag und Monat vertauscht sind! Ich hatte einen ähnlichen Fall und habe dann im Programm die Möglichkeit hinterlegt, ein Profil zu erstellen.


Ich will das ja nicht automatisch. Der Benutzer soll es eingeben können. Ich hatte nur irgendwie gehofft, das das einfacher geht, als 'von Hand' was zu programmieren um die Formatangabe zu analysieren.


FFKangoroo - Sa 13.05.06 14:17

Aso, hmm, da sag ich dann mal viel spaß. also du hast dann andere dateien die du damit öffnen möchtest? is ja so wie wenn du versucht ein .pdf file im editor zu öffnen. der weiss nicht wie er etwas interpretieren soll esseidenn jemand hat ihm vorher den schlüssel gegeben. was umgekehrt heisst du musst jeden fall vorher deklarieren. und auswählen wie er suchen muss. ansonsten hast du ja auch keine textmarke wo er einhaken kann mit dem suchen weil die ja nicht bei jedem gegeben sein muss.

was auch noch gehen würde ist einfach dass du ganz viel verschachtelst. aber das ist mir zu viel arbeit dir die fälle aufzulisten die du abfragen musst. ;) *faulist*

da ist es am besten wenn du vorher ein bäumchen zeichnest wie die abfrage gehen sonn und dann halt ganz oft "if..then if..then.. else .. else.." aber wie gesagt je individueller desto komplizierter. was anderes fällt mir momentan nicht ein. vielleicht steh ich auch auf nem schlauch ;)

FFKangoroo


jasocul - Sa 13.05.06 14:19

Das hatte ich auch verstanden. :wink:
Ich wollte nur noch mal auf die allgemeine Problematik eingehen.
Eine Mustersuche in einem String ist mir nicht bekannt. Aber ich könnte mir vorstellen, dass schonmal jemand sich mit sowas beschäftigt hat. Hast du schon bei http://www.torry.net nachgesehen?


FFKangoroo - Sa 13.05.06 14:21

Weisst du eigentlich wie in einem bestimmten Log das Format des datums ist? wenn ja dann brauchst du doch gar nicht erst zu analysieren dann kannst du ja einfach so ins suchfeld eintippen. wenn nicht dann musst du ja wirklich jede mögliche anordnung bedenken. und das von jasocul beachten

FFKangoroo


mega - Sa 13.05.06 14:25

Ich will doch nix analysieren.
Der Benutzer soll einfach eingeben, wie das Datum aufgebaut ist und wie man es erkennt (was vor dem Datum steht).


alzaimar - Sa 13.05.06 14:27

Wieso nimmt man nicht einfach ein 'StrToDateTime' in Verbindung mit dem globalen Datumsformat, das natürlich verändert werden kann. Wenn der Anwender dieses Format einfach vorgibt, kann die Logdatei eingelesen werden. Einfach mal die OH bemühen.


mega - Sa 13.05.06 21:28

Ich machs jetzt doch komplett selber. Ist garnicht so extrem, wie ich mir das erst vorgestellt hab.


alzaimar - Sa 13.05.06 22:22

Klar, wieso einfach, wenn's auch umständlich geht. :wink: