Programmieren zum Spaß: mit wem habe ich die meisten Kurse zusammen?
Für manche klingt Informatik trocken, weit weg von der Realität, ungreifbar. Aber es kann auch anders sein.
Am Anfang des 12. Jahrgangs ist mir aufgefallen, dass ich einen bestimmten Schüler in meinen Kursen immer wieder sehe. Zufall? Ich glaube nicht! Aber ich wollte es wirklich wissen.
Aus Langeweile und Spaß am Programmieren habe ich deshalb kurzerhand ein Programm geschrieben, um die Kurslisten einzulesen, zu verarbeiten, und mir dann auszugeben, mit welchen Personen aus dem Jahrgang ich die meisten Kurse zusammen habe und welche. Hier eine kurze Einführung, wie man so etwas angehen kann.
Kurslisten abtippen? Nein danke
Aus Datenschutzgründen sind in diesem Artikel alle Namen unkenntlich gemacht.
Dieses Dokument ist den 12ern von uns sehr bekannt. Auf 18 Seiten erstrecken sich hier die Kursbelegungen für den ganzen Jahrgang – abtippen möchte das keiner. Deshalb nutze ich stattdessen die Export-Funktionen meines PDF-Readers (Okular): File=>Export As=>Plain Text.
Heraus kommt eine .txt Datei und die sieht so aus:
Damit lässt sich schon mal besser arbeiten. Aber in der Textdatei stecken noch viele Unregelmäßigkeiten, die später Probleme verursachen können. Im Screenshot zum Beispiel sieht man schon, dass der erste Kurs (BIAr2) um zwei Zeilen nach unten verschoben ist. Weiter unten gibt es auch noch einen Kurs, dessen 34 (!) Teilnehmer den Rahmen des Text-Blocks sprengen. Diese Fehler muss man per Hand korrigieren, was zum Glück nicht lange gedauert hat. Die neue Datei habe ich exportierte-pdf-normalisiert.txt genannt und damit kommen wir jetzt zum Code.
Spaß mit Python
Für kleine ad-hoc Programme eignet sich die Programmiersprache Python sehr gut, weil sie einfach und schnell zu schreiben ist (es ist auch eine gute Einsteigerprogrammiersprache, vielleicht haben einige von euch schon Erfahrung damit?). Hier ist der gesamte Code:
Den ganzen Code durchzugehen, würde den Rahmen des Blog-Artikels (leider) sprengen. Deshalb erkläre ich nur einige Aspekte des Codes.
In Zeile 14 geht es los: die Textdatei wird mit dem open Befehl geöffnet und zeilenweise gelesen (readlines). Jede Zeile enthält unterschiedliche Informationen: zunächst die Kursnamen, dann die Kursleiter und dann die Teilnehmer (vgl. Screenshot oben). Das Programm prüft daher in Zeile 15, 21, 26 und 28, welche Art von Zeile vorliegt, um dementsprechend mit dem richtigen Verfahren die richtigen Daten zu extrahieren.
Schauen wir uns beispielsweise die Verarbeitung an, falls die Zeile Kursnamen enthält. Das sind Zeilen 16-20; wichtig ist vor allem Zeile 19, denn dort werden die Kursnamen tatsächlich extrahiert.
Es geht los mit dem line.split(“Kurs:“). Wir erinnern uns, dass in jeder Zeile bis zu fünf Kurse nebeneinander stehen, und dass vor jedem Kursnamen der Text „Kurs:“ steht (siehe Screenshot oben). Mit dem split Befehl teilt man die Zeile auf, indem an jedem Vorkommnis von „Kurs:“ ein Schnitt gemacht wird. Das Ergebnis (Beispiel):
""
" BIAr2 / Block 2 "
" BIBe3 / Block 3 "
" CHGd1 / Block 1 "
" CHWk2 / Block 2 "
" DEBn1 / Block 1 "
Der erste leere Eintrag entsteht, weil die Zeile ja mit „Kurs:“ beginnt. Python macht dort einen Schnitt und gibt uns auch den leeren Teil auf der linken Seite zurück. Der leere Eintrag ist aber irrelevant, also wird er im Code herausgefiltert mit if x != ““. Von den restlichen Einträgen entfernen wir zunächst die überflüssigen Leerzeichen links und rechts: x.strip(). Dann verwenden wir erneut den split Befehl; diesmal um im Text „BIAr2 / Block 2“ den Kursnamen vom Block zu trennen: .split(“ / “).
Auf ähnliche Weise verfährt das Programm auch mit den anderen Zeilen. Die extrahierten Kursdaten werden in der Liste alle_kurse gespeichert und am Ende der Funktion mit return abgegeben.
Mit wem habe ich denn jetzt die meisten Kurse?
Um der ursprünglichen Frage nachzugehen, dienen die Codezeilen 39-45. Der Code schaut für jeden Kurs in der Kursliste (Code: for kurs in kurse:), ob ich Teilnehmer bin (Code: if “Jannik Schaper“ in kurs.teilnehmer). Falls ja, werden die Teilnehmer des Kurses gespeichert. Später, in Zeile 44-45, sortiert das Programm den Teilnehmer danach, wie viele gemeinsamen Kurse verzeichnet wurden und gibt die Top 10 aus.
Fertig! Die meisten gemeinsamen Kurse habe ich mit mir selber – logisch.
Und die anfangs erwähnte Person, die ich so oft in meinen Kursen gesehen habe, ist tatsächlich dabei, an Stelle 4! Damit ist die Neugier endlich gestillt 🙂