Seite 1 von 1

Liste nach zwei kritereien durchsuchen

Verfasst: Samstag 16. Juni 2018, 10:27
von Omm
Hallo zusammen

ich möchte diese nachstehende Liste auf korrektheit prüfen.
logdatei(log.txt) sieht als Beispiel so aus:
Do, 12.04.2018, 08:00:00; xxx
Do, 12.04.2018, 09:00:00; ccc
Do, 12.04.2018, 10:00:00; FEIERABEND
Fr, 13.04.2018, 08:00:00; bbb
Fr, 13.04.2018, 09:00:00; rrr
Fr, 13.04.2018, 10:00:00; ccc
Fr, 20.04.2018, 11:00:00; xxx
Fr, 20.04.2018, 12:00:00; MITTAG
Fr, 20.04.2018, 13:00:00; xxx
Fr, 20.04.2018, 14:00:00; FEIERABEND

Check soll sein, dass an jedem Tag auch ein FEIERABEND vorhanden ist.
In der dieser Liste fehlt FEIERABEND vom 13.04.18. D.h. hier müsste dann ein Fehler kommen.
Mir fehlt die Idee wie ich sowas machen könnte. Kann mir das jemand bitte helfen.
Ich würde as so machen:
Loop über alles und die gleichen Tage immer zu einem str in einem dict zusammennehmen. Damit hätte ich im Beispiel 4 dict Einträge. Dann das dict auf FEIERABEND prüfen. Damit hätte ich auch den Tag der einen Fehler hat.

Ist das so stimmig?

Re: Liste nach zwei kritereien durchsuchen

Verfasst: Samstag 16. Juni 2018, 11:35
von __deets__
Da die Daten geordnet sind, gibt es dafuer eigentlich keinen Grund, die alle erstmal in eine Datenstruktur zu packen. Stattdessen kannst du itertools.groupby auf der Datei eingeleesen als CSV benutzen, und erzeugst dir dadurch gruppierte Eintraege nach Datum. Die kannst du dann wiederum nach Feierabend durchsuchen.

Code: Alles auswählen

import io
import csv
import operator
from itertools import groupby

DATA="""Do, 12.04.2018, 08:00:00; xxx
Do, 12.04.2018, 09:00:00; ccc
Do, 12.04.2018, 10:00:00; FEIERABEND
Fr, 13.04.2018, 08:00:00; bbb
Fr, 13.04.2018, 09:00:00; rrr
Fr, 13.04.2018, 10:00:00; ccc
Fr, 20.04.2018, 11:00:00; xxx
Fr, 20.04.2018, 12:00:00; MITTAG
Fr, 20.04.2018, 13:00:00; xxx
Fr, 20.04.2018, 14:00:00; FEIERABEND
"""

inf = io.StringIO(DATA)

for key, group in groupby(csv.reader(inf), operator.itemgetter(1)):
    group = list(group)
    if not any("FEIERABEND" in row[-1] for row in group):
        print(key, group)

Re: Liste nach zwei kritereien durchsuchen

Verfasst: Samstag 16. Juni 2018, 12:14
von Omm
oh, ein föllig anderer Ansatz.

Direkt und einfach. Super!
Vielen Dank

Code: Alles auswählen

   
    def check_log_datei(self,logdatei):
        status = False
        DATA = ''.join(logdatei)
        inf = io.StringIO(DATA)
        for key, group in groupby(csv.reader(inf), operator.itemgetter(1)):
            group = list(group)
            if not any("FEIERABEND" in row[-1] for row in group):
                wx.MessageBox('Daten inkonsistent.\nBitte überprüfe den Tag:  ' + key, 'Info', wx.OK | wx.ICON_INFORMATION)
                status = False
                break
            else:
                status = True
        return status

Re: Liste nach zwei kritereien durchsuchen

Verfasst: Samstag 16. Juni 2018, 12:36
von __blackjack__
@Omm: Das mit `DATA` und `StringIO` kannst Du Dir sparen würde ich mal sagen.

Re: Liste nach zwei kritereien durchsuchen

Verfasst: Samstag 16. Juni 2018, 12:41
von snafu
Und Fehlermeldungen sind hilfreicher, wenn sie genauer sind. Warum also nicht gleich hinschreiben, dass der Status Feierabend am Tag XY fehlt?

Re: Liste nach zwei kritereien durchsuchen

Verfasst: Samstag 16. Juni 2018, 13:51
von Sirius3
@__deets__: der OP braucht die Daten ja auch noch für die Weiterverarbeitung. Von daher kann man auch gleich auf den richtig geparsten Daten arbeiten. Deine Prüfung auf FEIERABEND ist auch sehr lax, da kann ein Tag gleich mit FEIERABEND beginnen.

@Omm: die Daten hatten wir ja schon aus Deinem anderen Thread in geparster Form. Da könnte man die Prüfung auf Feierabend auch gleich in die Schleife einbauen.

Separat sähe das dann so aus:

Code: Alles auswählen

def read_log_file(filename):
    result = []
    with open(filename) as lines:
        for date, job in csv.reader(lines, delimiter=';'):
            result.append((
                datetime.datetime.strptime(date.split(', ', 1)[1], "%d.%m.%Y, %H:%M:%S"),
                job.strip()
            ))
    return result

def check_log_data(data):
    for _, day in groupby(data, lambda x: x[0].date()):
        _, job = list(day)[-1]
        if job != "FEIERABEND":
            return False
    return True
Da Deine Methoden nie self benutzen, sollten die eigentlich gar nicht in einer Klasse stehen.

Re: Liste nach zwei kritereien durchsuchen

Verfasst: Samstag 16. Juni 2018, 15:11
von Omm
@sirius
das üersteigt mein können. :oops:

bei mir ist alles in einer MainFrame classe. Ich dachte das sei normal so. :(

Re: Liste nach zwei kritereien durchsuchen

Verfasst: Samstag 16. Juni 2018, 15:30
von __deets__
Sirius3 hat geschrieben: Samstag 16. Juni 2018, 13:51 @__deets__: Deine Prüfung auf FEIERABEND ist auch sehr lax, da kann ein Tag gleich mit FEIERABEND beginnen
Und bei dir gibt's kein Bier nach Feierabend :K Ich sehe jetzt nicht, wo der TE das (in diesem Thread zumindest) gefordert hat, dass Feierabend zwingend das letzte Element ist.

Re: Liste nach zwei kritereien durchsuchen

Verfasst: Samstag 16. Juni 2018, 15:33
von __deets__
Omm hat geschrieben: Samstag 16. Juni 2018, 15:11 bei mir ist alles in einer MainFrame classe. Ich dachte das sei normal so. :(
Nein. Es ist immer vorzuziehen, so wenig Zustand und Verquickung wie moeglich zu haben. Deine Prozessierung der Eingabedaten sollte losgeloest von der Darstellung (und Fehlermeldung) sein. Denn so schreibst du erstens Spaghetti-Code, der zu viel ineinander verzwirbelt. Das macht ihn schlecht wartbar. Und zweitens beraubst du dich der Moeglichkeit, den Code auch mal wieder zu verwenden, zB fuer ein kleines Skript das diese Bedingungen in eine Datenbank schreibt oder aehnliches.

Re: Liste nach zwei kritereien durchsuchen

Verfasst: Samstag 16. Juni 2018, 16:51
von Omm
Ja genau, Spaghetti-Code triffts genau. Denn die Übersicht ist kaum noch gegeben. :(
Da es mein erster Code ist, muss ich damit leben. ^^

Re: Liste nach zwei kritereien durchsuchen

Verfasst: Samstag 16. Juni 2018, 16:56
von __deets__
Nö, du kannst das angehen und umarbeiten. Macht man andauernd. Weil Anforderungen sich ändern, man das Problem besser versteht, etc.

Wichtig ist es kleinschrittig und gut getestet zu machen. Es bietet sich an GIT oder ein anders Versionskontrollsystem zu benutzen, damit man keinen Code verliert.

Und das wx.Message zb hast du selbst in die Code Vorlage gestrickt. Das war ja deine gerade erst getroffene Entscheidung.