
Ok Jahrzehnte später habe ich aus dem dBase Excel bzw CSV gemacht und bin mit Turbo-Pascal herangegangen. Dabei muß ich aber wohl einen kleinen Fehler eingebaut haben bei der Portierung oder es ging auch gar nicht so in Pascal wie in dBase. Also habe ich 2 Tage gesucht und nicht gefunden - das Programm läuft ja nur ist eine unerklärliche Ausnahmebehandlung drin, die das Auge für den Algorithmus mächtig stört.
Ich habe chatGPT gefragt, der hat es ehrlich gesagt nur verschlimmbessert, immerhin gewann ich so die Idee: weg von der Datei/CSV und lieber am Anfang einlesen in eine Liste.
Den hier gezeigten Code habe ich zu 60% selbst entworfen (vor allem den CSV-Reader etc). chatGPT hat dann die Ablauflogik ergänzt - teils freiwillig. teils nach Diskussion in deutscher Sprache und teils nach Vorlage interessanterweise lieber der dBase Quelle. An mein portiertes Pascal wollte er nicht ran bzw es kam nur Schrott dabei heraus. Nun würde ich gerne euer vernichtendes Urteil dazu hören
Code: Alles auswählen
import csv
def read_csv(filename):
data = []
with open(filename, newline='') as csvfile:
reader = csv.DictReader(csvfile, delimiter=';')
for row in reader:
row['M1'] = int(row['M1'])
row['M2'] = int(row['M2'])
row['M3'] = int(row['M3'])
row['N1'] = int(row['N1'])
row['N2'] = int(row['N2'])
row['L1'] = int(row['L1'])
data.append(row)
return data
def search_csv_2(data, m1, m2):
result = []
for row in data:
if row['M1'] == m1 and row['M2'] == m2 and row['PROG'] != 'D':
result.append((row['PROG'], row['BEZEICHNER'], row['CODE'], row['M3'], row['N1'], row['N2'], row['L1']))
return result
def show_menu(data, m1, m2, bezeichnung="Hauptmenü"):
menu_items = search_csv_2(data, m1, m2)
# Wenn keine Menüeinträge vorhanden sind, sofort Fehlermeldung anzeigen
if not menu_items:
print("Ungültige Auswahl.")
return menu_items
# Andernfalls Menü anzeigen
print(f"\n{bezeichnung}:")
for prog, bezeichner, code, m3, n1, n2, l1 in menu_items:
print(f"{m3}: {bezeichner}")
print("0: Zurück")
return menu_items
def find_menu_item(data, m1, m2, m3):
for row in data:
if row['M1'] == m1 and row['M2'] == m2 and row['M3'] == m3:
return row
return None
def run_menu(data):
m1, m2 = 0, 0 # Start im Hauptmenü
menu_stack = [] # Stack für die Menüs
bezeichnung = "Hauptmenü" # Start mit "Hauptmenü"
menu_active = True
menu_displayed = False # Neu: Um zu steuern, ob das Menü erneut angezeigt wird
while menu_active:
if not menu_displayed: # Nur wenn das Menü nicht bereits angezeigt wurde
menu_items = show_menu(data, m1, m2, bezeichnung)
menu_displayed = True # Menü wurde jetzt angezeigt
choice = int(input("Auswahl: "))
if choice == 0:
if not menu_stack:
print("Programmende.")
menu_active = False
else:
# Zurück ins übergeordnete Menü
m1, m2, bezeichnung = menu_stack.pop()
menu_displayed = False # Menü muss wieder angezeigt werden
else:
selected_item = find_menu_item(data, m1, m2, choice)
if selected_item:
prog = selected_item['PROG']
if prog.lower() == 'p':
print(f"Starte Programm: {selected_item['CODE']}")
elif prog.lower() == 'm':
# Prüfe, ob das Untermenü gültige Einträge hat
n1, n2 = selected_item['N1'], selected_item['N2']
submenu_items = search_csv_2(data, n1, n2)
if submenu_items: # Nur wenn es gültige Einträge gibt
# Merke das aktuelle Menü
menu_stack.append((m1, m2, bezeichnung))
# Gehe ins Untermenü
m1, m2 = n1, n2
bezeichnung = selected_item['BEZEICHNER'] # Bezeichnung merken
menu_displayed = False # Menü muss für das neue Untermenü angezeigt werden
else:
# Zeige Fehlermeldung, aber ändere M1 und M2 nicht
print("Ungültige Auswahl.")
else:
print("Ungültige Auswahl.")
# Menü bleibt sichtbar, also bleibt menu_displayed = True unverändert
def main():
csv_data = read_csv('freiburg.csv')
run_menu(csv_data)
if __name__ == "__main__":
main()
Logging (das einzige was mich interessierte). Leider kann der sich nie die aktuelle fehlerfreie Version merken selbst wenn ich sie eingebe und greift immer wieder auf altes zurück und das hat mich am Ende so genervt, daß ich gesagt habe - okay Schluß damit, das ist ein Fall fürs Forum.
HIer übrigens meine gefakte EIngabedatei (die echte behandelt Fußball-Ligaverwaltung), und ja ich habe absichtlich Fehler eingebaut, damit alle Zweige auch duchlaufen werden.
Code: Alles auswählen
M1;M2;M3;PROG;BEZEICHNER;CODE;N1;N2;L1
0;0;1;P;Anwendung 1;Anw-1;99;99;0
0;0;2;P;Anwendung 2;Anw-2;99;99;0
0;0;4;M;Untermenue 1;99;0;4;1
0;0;5;M;Untermenue 2;99;0;5;0
0;0;9;D;(frei);0;0;9;0
0;6;1;M;Untermenue 1-1;99;4;1;1
0;6;2;M;Untermenue 1-2;99;4;2;0
0;6;3;P;Anwendung 1-3;Anw-1-3;99;99;0
0;5;1;M;Untermenue 2-1;99;5;1;1
0;5;2;M;Untermenue 2-2;99;5;2;0
0;5;3;P;Anwendung 2-3;Anw-2-3;99;99;0
4;1;1;P;Anwendung 1-1-1;Anw-1-1-1;99;99;0
4;1;2;P;Anwendung 1-1-2;Anw-1-1-2;99;99;0
5;1;1;P;Anwendung 2-1-1;Anw-2-1-1;99;99;0
5;1;2;P;Anwendung 2-1-2;Anw-2-1-2;99;99;0
4;2;1;P;Anwendung 1-2-1;Anw-1-2-1;99;99;0
4;2;2;P;Anwendung 1-2-2;Anw-1-2-2;99;99;0
5;3;1;P;Anwendung 2-2-1;Anw-2-2-1;99;99;0
5;3;2;P;Anwendung 2-2-2;Anw-2-2-2;99;99;0
Ich habe das aber etwas hinten an geschoben und mir lieber Gerüste (nur CSV Lesen/Auswerten und zwei Zugriffsfunktionen für das Array) in jeweils Pascal und Java erstellt und wollte nun mal sehen, wo ich die Logik besser hinbekomme. Natürlich weiß ich daß es nicht so schön wie in Python sein wird - aber okay werdet ihr sagen, in Python ist es ja auch alles andere als schön. Ich tppe mal am Ende auf die Gefallensreihenfolge
Python-Pascal-Java - kann mich aber irren.