AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Nicht eindeutige Dateinamen zueinander zuordnen

Nicht eindeutige Dateinamen zueinander zuordnen

Ein Thema von Rülps · begonnen am 26. Aug 2015 · letzter Beitrag vom 31. Aug 2015
Antwort Antwort
Seite 3 von 3     123
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.658 Beiträge
 
Delphi 7 Personal
 
#21

AW: Nicht eindeutige Dateinamen zueinander zuordnen

  Alt 28. Aug 2015, 11:19
[QUOTE=Dejan Vu;1313770Logisch: Ohne 'C' geht nix. Aber sonst?
[/QUOTE]

Und ohne A und oder B auch nicht! Und was das "logisch" angeht, es gibt mehr QnD-Lösungen, die auf "das passiert doch nieee" basieren, als es Sand am Nordseestrand gibt.

Darum würde ich erst einmal prüfen, was an Dateien überhaupt herein kommt. Und diese dann entweder angleichen, wird kein Protokoll geführt sollte das gehen, oder aber z.B. Records nutzen.
Delphi-Quellcode:
Type
  TMyFiles = record
               fn1 : string;
               fn2 : string;
               fn3 : string;
  end;
Wobei LogdateiName z.B. besser wäre als fn1.

Oder die entsprechende Tabelle mit den zugehörige Dateinamen füttern
oder .....

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#22

AW: Nicht eindeutige Dateinamen zueinander zuordnen

  Alt 28. Aug 2015, 12:25
Ausgehend davon das 1 = 1 Tag ist, ist eine Sekunde (ca.) 1,1574074074074074074074074074074e-5
(= 1 / 24 / 60 / 60)

Drei Dateien sind also in einem Zeitfenster von 2 * 1,1574074074074074074074074074074e-5 zu suchen und zwei Dateisätze liegen ca. 30 * 1,1574074074074074074074074074074e-5 auseinander.
Derartige Berechnungen gehen mit TDateTime ganz einfach, das ist nur ein bisserl Mathematik mit ein Größe-/Kleinervergleichen.
Ernsthaft?

Wie wäre es mit SecondsBetween(A,B) < 30
Wieso nicht ernsthaft, was macht denn SecondsBetween? Es ermittelt bei zwei TDateTime das Zeitfenster und mit < 30 wird letztlich geprüft, ob dieses eben kleiner ca. 30 * 1,1574074074074074074074074074074e-5 ist.

Um auf < 30 zu prüfen, muss irgendwo im Inneren von SecondsBetween ja aus den beiden Floatwerten, die die TDateTimes nun mal sind, die Differenz in Sekunden berechnet werden. Wer jetzt wann, was wie umrechnet, ist eigentlich egal, es geht letztendlich "nur" um Mathematik.

Hier im konkreten Fall dürfte es sinnvoll sein, zuerst festzustellen, welche der drei Dateien vom "Herstellungsprozess" zuletzt geschrieben wird.
Nur nach diesen Dateien würde ich suchen. Aus deren Dateinamen lässt sich der Dateiname der anderen Dateien ableiten und mit FileExists prüfen, ob diese Dateien vorhanden sind.
Die zugehörigen Dateien müssen in einem Zeitfenster von etwa 1 bis 2 Sekunden gefunden werden. Durch entsprechende Manipulation der Dateinamen (also Dateinamensteile in TDateTime umwandeln, minus 1 Sekunde und zurück in Dateinamen umwandeln) kann mit FileExists auf diese beiden Dateien geprüft werden. (Zur Sicherheit eventuell bei Misserfolg auf dem gleichen Weg noch eine Sekunde abziehen und erneut prüfen.) Fehlt eine der Dateien, so ist was faul.
Der Zeitabstand zwischen der Erstellung der jeweils zuletzt erstellten Dateien dieser Tripels, ist dabei dann schon fast irrelevant.

Liegt die Zeitdifferenz zwischen zweien der zuletzt erstellten Dateien oberhalb des Prozessintervals des "Herstellungsprozesses", so kann man hierüber ebenfalls feststellen, ob die Tripels vollständig vorhanden sind oder eben nicht. Das SecondsBetween müsste hier also between ca. 25 and 35 Seconds liegen.
Also eher einif SecondsBetween(A,B) in [25..35] then ok else nicht_ok; Ein stures < 30 ist da (vermutlich) zu starr. Aber hier kann man nur spekulieren, man müsste mehr Informationen zum genauen Prozessablauf haben, um genauere Vorschläge für die Zeitangaben machen zu können.

Das es das SecondsBetween gibt ist für diese Ausgabenstellung zwar ganz nett, aber eigentlich nicht erforderlich.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.024 Beiträge
 
Delphi 10.3 Rio
 
#23

AW: Nicht eindeutige Dateinamen zueinander zuordnen

  Alt 28. Aug 2015, 13:49
Das SecondsBetween müsste hier also between ca. 25 and 35 Seconds liegen.
natürlich nicht...

SecondsBetween wird sicherlich bei 1-3 liegen...

Es geht ja nur darum die Datei zu finden die zum gleichen Zeitpunkt erstellt worden ist... mit der 1-3 Sekunden Verzögerung. Da das Intervall der Erzeugung bei 30 Sekunden liegt, bis wieder 3 Dateien kommen war <30 GENAU richtig!
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#24

AW: Nicht eindeutige Dateinamen zueinander zuordnen

  Alt 28. Aug 2015, 14:56
Das SecondsBetween müsste hier also between ca. 25 and 35 Seconds liegen.
natürlich nicht...

SecondsBetween wird sicherlich bei 1-3 liegen...

Es geht ja nur darum die Datei zu finden die zum gleichen Zeitpunkt erstellt worden ist... mit der 1-3 Sekunden Verzögerung. Da das Intervall der Erzeugung bei 30 Sekunden liegt, bis wieder 3 Dateien kommen war <30 GENAU richtig!
Zitat von Rülps:
Abstände zwischen Events sind aus technischen Gründen immer mindestens 30 Sekunden voneinander entfernt.
von daher kann < 30 richtig sein, muss es aber nicht.

< 30 kann richtig sein, wenn es um die Zeitdifferenz von drei zueinander gehörenden Dateien geht. Es ist aber falsch, wenn es um den Zeitabstand von jeweils zwei Dateitripeln geht, hier müsste es dann >= 30 heißen.

Ob 30 Sekunden richtig oder falsch sind, kommt auf den Standpunkt an.

Daraus resultierte mein Vorschlag, nur die jeweils zuletzt erstellte Datei (anhand des Dateinamenmusters) zu suchen und die zugehörigen Dateien zuerst zum gleichen Zeitpunkt zu erwarten und wenn nicht gefunden nochmal mit einer Zeitdifferenz von einer, bei weiterem Misserfolg einer weiteren, Sekunde zu suchen.

Dateizeit sei also 10_00_03.
Erste Versuch mit 10_00_03.
zweiter Versuch mit 10_00_02
dritter Versuch mit 10_00_01
und schon haben wir
Zitat von Mavarik:
SecondsBetween wird sicherlich bei 1-3 liegen...
für das Dateitripel.

Die Zeit zwischen zwei Dateitripeln sollte (s. o.) größer oder gleich 30 sein.
Da ich halt nicht so recht weiß, wie genau die Zeitvergabe bei den einzelnen Dateien ist, hatte ich als "Toleranzgrenze" halt mal als Beispiel 5 Sekunden angenommen.

Frei nach dem Motto: Wenn zwei Dateitripel mehr oder weniger als 25 bis 35 Sekunden auseinander liegen, dann stimmt höchstwahrscheinlich etwas nicht. Für genaue Angaben muss man das System halt besser kennen oder weitere Informationen bekommen. Aber vermutlich ist das Problem längst gelöst und eine Diskussion über SecondsBetween 1..3 oder SecondsBetween 25..35, jenachdem welches Problem man nun löst (Konsitenz innerhalb eines Dateitripels oder zwischen zwei Dateitripeln), nicht weiter von Belang.
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
909 Beiträge
 
Delphi 6 Professional
 
#25

AW: Nicht eindeutige Dateinamen zueinander zuordnen

  Alt 28. Aug 2015, 18:32
Hallo..

Wenn ich das richtig gelesen habe, dann kommt ein Datenträger mit diversen dieser Event-Dateien.

Dann würde ich anders vorgehen..

Einlesen aller Dateinamen in eine Liste.
Dekodieren der Zeitanteile zu TDateTime.

Prüfen, welche Dateien innerhalb, sagen wir mal 5 Sekunden, beisammen sind, ausgehend von einer der Dateien, z.B. die .csv und dann diese 3 Dateien zusammen einlesen/verarbeiten.

Mit FileExists würde man im ungünstigsten Fall 4-5 Versuche je Paket machen, und jedes Mal somit auf dem Datenträger hantieren und jedes mal die Dateinamen formatieren.

Wenn so alles im Speicher stattfindet, ist dies einfach nur zunächst ein sortieren der Liste nach Zeitpunkt und dann die nächsten 2 Dateien prüfen.

Sollte am schnellsten gehen...
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#26

AW: Nicht eindeutige Dateinamen zueinander zuordnen

  Alt 28. Aug 2015, 19:02
Hallo..

Wenn ich das richtig gelesen habe, dann kommt ein Datenträger mit diversen dieser Event-Dateien.

Dann würde ich anders vorgehen..

Einlesen aller Dateinamen in eine Liste.
Dekodieren der Zeitanteile zu TDateTime.

Prüfen, welche Dateien innerhalb, sagen wir mal 5 Sekunden, beisammen sind, ausgehend von einer der Dateien, z.B. die .csv und dann diese 3 Dateien zusammen einlesen/verarbeiten.

Mit FileExists würde man im ungünstigsten Fall 4-5 Versuche je Paket machen, und jedes Mal somit auf dem Datenträger hantieren und jedes mal die Dateinamen formatieren.

Wenn so alles im Speicher stattfindet, ist dies einfach nur zunächst ein sortieren der Liste nach Zeitpunkt und dann die nächsten 2 Dateien prüfen.

Sollte am schnellsten gehen...
Deshalb hatte ich ja auch mal vorgeschlagen, den "Spass" (da ja sowieso mit 'ner Datenbank gearbeitet wird) in der Datenbank "abzufackeln".
Dateiname rein in die Tabelle, Datums-/Zeitanteil aus dem Dateinamen in eine Datums-/Zeitspalte, sortieren und schon hat man alles beieinander.

Und man hat die Informationen nicht nur zur Laufzeit im Arbeitsspeicher, sondern dauerhaft zur Verfügung.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#27

AW: Nicht eindeutige Dateinamen zueinander zuordnen

  Alt 29. Aug 2015, 14:34
Logisch: Ohne 'C' geht nix. Aber sonst?
Und ohne A und oder B auch nicht! Und was das "logisch" angeht, es gibt mehr QnD-Lösungen, die auf "das passiert doch nieee" basieren, als es Sand am Nordseestrand gibt.
Äh... Also wenn ich eine Heuristik erstelle, die davon ausgeht, das -ausgehend von einer Datei 'C'- die beiden unmittelbaren Vorgängerdateien suche, dann ist 'C' nun einmal Voraussetzung dafür. Allerdings kann 'A' bzw. 'B' optional sein, denn ich kann maximal bis zum vorherigen 'C' gehen. Ergo? Geht es mit ohne A und B.
Pseudocode:
Delphi-Quellcode:
p := Data.Length;

while i>0 do begin
  i := FindPrevious_C (P);
  j := FindPrevious_C (i-1);
  CollectFiles (Data[j+1]....Data[i]);
  p := i-1;
end;
  Mit Zitat antworten Zitat
Rülps

Registriert seit: 26. Sep 2008
38 Beiträge
 
#28

AW: Nicht eindeutige Dateinamen zueinander zuordnen

  Alt 31. Aug 2015, 20:43
So danke liebe Community. Mit TDateTime und ein wenig Handarbeit hat es nun wunderbar geklappt. Herzlichen Dank für die Hilfe!
*Doppel-Rülps*
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 08:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf