Liste nach zwei kritereien durchsuchen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Omm
User
Beiträge: 90
Registriert: Samstag 7. April 2018, 14:05

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?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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)
Omm
User
Beiträge: 90
Registriert: Samstag 7. April 2018, 14:05

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
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Omm: Das mit `DATA` und `StringIO` kannst Du Dir sparen würde ich mal sagen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Und Fehlermeldungen sind hilfreicher, wenn sie genauer sind. Warum also nicht gleich hinschreiben, dass der Status Feierabend am Tag XY fehlt?
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@__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.
Omm
User
Beiträge: 90
Registriert: Samstag 7. April 2018, 14:05

@sirius
das üersteigt mein können. :oops:

bei mir ist alles in einer MainFrame classe. Ich dachte das sei normal so. :(
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Omm
User
Beiträge: 90
Registriert: Samstag 7. April 2018, 14:05

Ja genau, Spaghetti-Code triffts genau. Denn die Übersicht ist kaum noch gegeben. :(
Da es mein erster Code ist, muss ich damit leben. ^^
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Antworten