doppelte Einträge, in einem bestimmten Zeitraum löschen

  • Hallo Liebes Forum :) ,

    Ich hänge leider an einem Skript und wollte fragen ob Ihr evtl mir helfen könntet.

    Ich habe eine Tabelle, habe diese hier als Beispiel erstellt : example.csv

    Ich möchte nun erst die Gerätenamen vergleichen, falls ein gleichnamiges Gerät gefunden wird soll die Entstehungszeit beider Geräte überprüft werden,

    Innerhalb von 300sekunden(5min) , sollen dann die doppelten Einträge entfernt werden.

    In der neunen Datei soll dann die Anzahl der gefunden doppelten innerhalb der l (5min grenze) gefundenen Einträge stehen.

    Hier ist mein Beispiel Skript leider habe ich es bisher noch nicht hinbekommen, das es richtig funktioniert.

    So sollte das Endergebnis aussehen :

    Code
    als CSV
    
    1-G;10.10.2022 00:10:55;anzahl innerhalb 5min;3;
    7-G;10.10.2022 00:14   ;;anzahl innerhalb 5min;1;
    6-G;10.10.2022 00:14   ;anzahl innerhalb 5min;1;
    5-G;10.10.2022 00:14   ;anzahl innerhalb 5min;1;
    4-G;10.10.2022 00:14   ;anzahl innerhalb 5min;1;
    3-G;10.10.2022 00:13   ;anzahl innerhalb 5min;1;
    1-G;10.10.2022 00:20   ;anzahl innerhalb 5min;1;

    Edit : habe das Endergebnis hier angepasst,
    das zusätzliche Datum das mit drinnen stand hat hier im Beispiel irritiert, das war aus meiner Original datei.

    2 Mal editiert, zuletzt von MojoeB (2. Dezember 2022 um 13:48)

  • Mein Vorschlag - du benötigst hierfür noch zusätzlich >diese UDF<:

  • Mein Vorschlag wäre so:

    Wobei es dann Probleme bei anderem Datum geben würde (wenn mehr als 1 Tag vorhanden ist), sehe ich gerade.

    Ich denke da ist das von AspirinJunkie besser :)

    Einmal editiert, zuletzt von Moombas (2. Dezember 2022 um 15:13)

  • Hier mal die Überarbeitete Version mit dem RegEx von AspirinJunkie (sorry fürs klauen :P)

    Damit sollte das Problem mit dem Datum bei mir auch behoben sein.

    Einmal editiert, zuletzt von Moombas (2. Dezember 2022 um 15:44)

  • @AspirinJunkie

    irgendwie nice, aber ich bekomm es immer noch nicht so hin wie ich möchte.

    Die csv war ja eine beispiel Datei, die die ich bearbeiten muss ist um einiges größer.

    mit mehreren spalten und Zeilen

    ; Wenn Zeitdiff < 5 Minuten, dann zum überschreiben markieren (durch Zählererhöhung):

    das ist korrekt aber ich brauch den zähler ja nur bei den gefunden doppelten innerhalb 5min das heißt

    Bsp. Gerät 1 sendet 7x innerhalb 5min.

    veranschaulicht : Row : $i| Col:0| Gerät ; Col:1| Zeit/datum ; Col:2| Anzahl

    Endergebnis : Gerät 1 ; 'zeit/datum'; 7

    Ich habe es grad etwas versucht es zu erweitern aber anscheint nutze ich etwas falsch, da mit meinen Änderungen,

    genau wieder das passiert was mir schon heute Morgen passiert ist.

    Entweder wird keine Anzahl geschrieben oder es sind wieder doppelte werte drinnen die eigentlich übersprungen wurden.


    Ich werde morgen weiter machen, aber danke für die schnellen Infos euch beiden @AspirinJunkie,  @Moombas

    @Moombas

    mit deinem Skript bekomme ich bei geänderter *csv Fehler im Array angezeigt.
    also bei dem ersten Eintrag [0][1]stand da 4:00 <- da wusste ich jetzt nicht wo ich es zuordnenden sollte war das die Zeit?

    ps: irgendwie hab ich hier ein Problem mit der Schriftform & größe ich habe alles markiert aber nur ein Teil lässt sich ändern.

  • ist eigentlich die Anzahl der Geräte bzw. deren Namen eine feste Größe?

    Anders ausgedrückt gibt es eine Liste der Geräte die sich thor. melden können?

    Gruß

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • das ist korrekt aber ich brauch den zähler ja nur bei den gefunden doppelten innerhalb 5min das heißt

    Bsp. Gerät 1 sendet 7x innerhalb 5min.

    Ok das mit der Anzahl hatte ich nicht gesehen.

    Natürlich kann man dies mit ergänzen:

  • Moin,

    ich habe versucht, das mit einer Map zu lösen (braucht 3.3.16+). Das Ausgabeformat des Datums entspricht noch nicht Deiner Vorgabe, das lässt sich aber einfach anpassen.

    Gibt es übrigens wirklich unterschiedliche Zeitangaben (mit/ohne Sekunden) in der CSV-Datei?

  • Witzig, das mir das auch entgangen ist mit der Anzahl :D

    @Moombas

    mit deinem Skript bekomme ich bei geänderter *csv Fehler im Array angezeigt.
    also bei dem ersten Eintrag [0][1]stand da 4:00 <- da wusste ich jetzt nicht wo ich es zuordnenden sollte war das die Zeit?

    ps: irgendwie hab ich hier ein Problem mit der Schriftform & größe ich habe alles markiert aber nur ein Teil lässt sich ändern.

    Es ist schwer dazu etwas zu sagen, ich vermute das es da ggf. Probleme mit dem Reg-Ex gibt(?), da zweistellige (in deinem Beispiel: 04:00) erwartet werden.

    Hierbei wäre es gut die CSV bzw. die Daten, wo der Fehler auftritt zu haben. Aber schaue dir doch erst mal die neue Lösung von AspirinJunkie in Post #8 an, evtl. passt die ja schon zu dem was du suchst, da ich bei mir noch die Anzahl auch noch mit einbauen müsste (sollte aber machbar sein).

    Wenn das von Aspirin widererwartend noch nicht passen sollte gerne die angesprochenen Sachen mal posten und dann schaue ich bei mir nochmal rein ;)

  • So Leute habe mir am Wachende nichts mehr dazu angeschaut, es kommt immer änderst als man es sich vorstellt ^^

    Peter S. Taler

    nein leider keine festen Größen es kann sich von Tag zu Tag ändern.

    Moombas

    Danke nochmal für den versuch,

    Velted :
    danke :) ich schau es mir zuhause nochmal an auf der Arbeit habe ich noch die ältere Version von autoit


    @AspirinJunkie :
    Genau :) jetzt stimmt es habe nun auch den Code angepasst das es auch auf der großen Liste funktioniert.

    Dabei sind mir 2 Sachen aufgefallen:

    1. ab und an mal schreibt er den Counter nicht mit warum weiß ich nicht.

    2. Trotz _ArraySort($aCSV, 0, 0, 0, 1) werden nicht alle Daten nach Datum/Zeit geordnet siehe bild.

    Aber genauso in der Form habe ich es mir das vorgestellt :) danke AspirinJunkie.

  • 1. ab und an mal schreibt er den Counter nicht mit warum weiß ich nicht.

    Wenn es auftritt, dann nur bei einem einzigen Eintrag?

    Falls ja: Ist ein Sonderfall bei dem der erste Eintrag im (sortierten) Array keine weiteren Elemente mehr in den 5 Minuten hat.

    Lösung: folgendes noch vor die Schleife packen: $aCSV[0][2] = 1

    2. Trotz _ArraySort($aCSV, 0, 0, 0, 1) werden nicht alle Daten nach Datum/Zeit geordnet siehe bild.

    Das Bild sagt mir, dass nicht mein Code verwendet wurde.
    Wenn wir dir helfen sollen musst du uns schon den Code zeigen, der dies hervorbringt.

    Im Bild sind die Zeitangaben in "Col 2" aufgeführt.

    In meinem Code steht dort hingegen die Anzahl und die Zeitangaben stehen hingegen in der zweiten Spalten - der Spalte mit der Nummer 1 (da 0-basiert).

  • @AspirinJunkie :

    Es ist größtenteils dein Code, habe es in einer Funktion geparkt, :/ habe es so erweitert das es zu meinem Input File passt.

    Dort sind leider Daten drinnen die ich öffentlich nicht preisgeben darf. hier ist nun die Funktion, ich gebe das sortierte erstellte Array zurück & lasse mir danach eine csv Datei mit den den Daten des Arrays erstellen.
    Als ich dann die Datei überprüft habe, habe ich das mit der (Datum/Zeit ) Anordnung festgestellt.

    Habe danach mir das Array nach dem Return angesehen, dort war es nur zum Teil nach (Datum/Zeit ) angeordnet, ob das nur zufall ist weiß ich nicht <.< um den entgegenzuwirken habe ich dann nochmal das hier auf das Return Array

    Code
    _ArraySort($aCSV, 0, 0, 0, 1)

    angewandt, hat aber nicht sehr viel gebracht ^^, oder funktioniert das nur in mit :

    Code
    _ArraySortFlexible

    ?

    oder konnte es an der Form des Datums liegen, ich probiere gleich nochmal ^^
    habe heute leider viel anders zeug zu tun.

    Hier mal der veränderte ^^ Code :

  • Bei der Arraysort-Zeile die du gepostet hast, ist dieses so eingestellt, dass es das Array anhand der 2. Spalte sortiert.

    Du bemängelst hingegen, dass die 3. Spalte des Arrays nicht sortiert wurde.

    Problem erkannt?

  • Moin,

    das mit meiner Map kannst Du vergessen. Ich habe die Aufgabenstellung falsch verstanden. Ich habe jetzt aber noch eine Array-basierte Lösung, die - so sie denn macht was Du willst - das Array in der ursprünglichen Reihenfolge belässt.

    Du kannst ja mal probieren. Bei sehr großen Eingabedateien mag es allerdings etwas dauern. Die Ergebnisausgabe per MsgBox ist auch suboptimal. ;)

  • Btw: Ich dachte erst ganz naiv, dass lässt sich doch direkt mit sqlite abfrühstücken.
    Ich trau mir da schon einiges zu, aber tatsächlich bin ich mit der Aufgabe hier per reiner sqlite-Lösung krachend gescheitert.
    Selbst mit window-functions und rekusiven CTEs kam ich nicht ran.

    Also wenn einer etwas blickig ist - das wäre vielleicht ne interessante Challenge um seine sqlite-Kenntnisse zu vertiefen.

  • sry das ich mich so spät zurückmelde aber ich konnte nun endlich weiter programmieren, und AspirinJunkie :) super Arbeit jetzt verstehe ich auch die _Arraysort Funktion und den sinn dahinter dankeeee!!! :D wuhu :)

    Velted deins habe ich noch nicht getestet aber es ist gut wenn hier etwas Code drinnen steht vielleicht kann man das mal gebrauchen jetzt ist aber erstmal der Beitrag abgeschlossen :theke: danke an alle für die Hilfe.