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?
Liste nach zwei kritereien durchsuchen
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)
oh, ein föllig anderer Ansatz.
Direkt und einfach. Super!
Vielen Dank
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
- __blackjack__
- User
- Beiträge: 13112
- 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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
@__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:
Da Deine Methoden nie self benutzen, sollten die eigentlich gar nicht in einer Klasse stehen.
@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
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.
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.
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.
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.