Created
November 2, 2010 18:55
-
-
Save julians/660102 to your computer and use it in GitHub Desktop.
Parst(?) diese fette SPLUS-Datei, die wir von Herrn Kobi bekommen haben und macht eine CSV-Datei draus.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
# -*- coding: utf-8 -*- | |
# Die erste Zeile sagt dem Terminal, dass das hier Python-Code ist. | |
# Die zweite Zeile sagt dem Python-Interpreter: »Hey, hier gibt’s Unicode, keine Angst« – | |
# sonst stürzt er ab, falls man irgendwelche Sonderzeichen im Code oder den Kommentaren verwendet. | |
# Man braucht keine der beiden Zeilen, wenn man zu faul zum Tippen ist und nur ASCII benutzt. | |
import sys | |
# getopt ist für die Kommandozeilenargumente zuständig | |
import getopt | |
# re ist das mit den Regular Expressions | |
import re | |
# Codecs brauchen wir, um die utf-8 Datei lesen zu können | |
import codecs | |
# Na was das wohl macht … | |
import csv | |
# Die Hauptfunktion, die wir beim Start des Programmes aufrufen – siehe ganz unten. | |
# Könnte natürlich auch »deine_mutter« oder so heißen | |
def main(argv): | |
# Wir versuchen mal, die Kommandozeilenargumente zu parsen | |
try: | |
opts, args = getopt.getopt(argv, "", ["file="]) | |
except getopt.GetoptError: | |
print "Crap, invalid arguments!" | |
sys.exit(2) | |
for opt, arg in opts: | |
# Hier loopen wir gerade durch die Argumente und schauen, ob was für uns dabei ist | |
if opt in ("--file"): | |
filename = arg | |
# Nun versuchen wir, die Datei zu öffnen und zu lesen | |
try: | |
raw_text = codecs.open(filename, "r", "utf-8").read() | |
except: | |
print "Oh noes, no file!" | |
return | |
# So, hier machen wir mal nen csv-writer, der uns dann eine Datei schreiben wird, | |
# die man sehr schön in Numbers, Excel, wo auch immer benutzen kann. | |
csvFile = csv.writer(open('yay.csv', 'wb'), delimiter=';') | |
write_csv_header(csvFile) | |
# Regex, um die ganze große fette Datei in die einzelnen Veranstaltungen zu splitten | |
# (raw string notation: r"", so dass man nicht zigtausend Backslashes escapen muss | |
# und man den String über mehrere Zeilen schreiben kann) | |
entry_pattern = re.compile(r""" | |
^#SPLUS[a-z0-9]{6} # Zeilenanfang, gefolgt von #SPLUS und sechs Buchstaben oder Zahlen | |
.+? # alles mögliche, aber nicht-greedy | |
\\!?$ # ein Backslash, direkt gefolgt von: null oder ein Ausrufezeichen, | |
# dann Zeilenende | |
""", re.IGNORECASE | re.MULTILINE | re.UNICODE | re.DOTALL | re.VERBOSE) | |
# So, nun loopen wir durch die Veranstaltungen | |
for match in entry_pattern.finditer(raw_text): | |
# Splitten die wiederum in die einzelnen Felder | |
fields = match.group().split("\\") | |
# So, die Zeile wird in die CSV-Datei geschrieben | |
# – aber vorher die Werte alle noch enkodiert, weil der csv-writer sonst meckert, | |
# weil Python < 3.0 + Unicode == $!%$%%! | |
csvFile.writerow([field.encode('utf-8') for field in fields]) | |
print "-------" | |
# Benutze enumerate anstatt einfach nur for … in, damit ich auch die Zahl (i) bekomme | |
# for i, field in enumerate(fields): | |
# Die Zahl wird dann in nen String umgewandelt und links mit Leerzeichen aufgefüllt, | |
# so dass sie immer zwei Zeichen breit ist | |
# if len(field): print "%s %s" % (str(i).rjust(2), field) | |
# Ja … nicht so wirklich elegant, aber egal ;) | |
def write_csv_header(csvFile): | |
csvFile.writerow([field.strip().encode('utf-8') for field in u"FB: Primärschlüssel FB;FB: Name;FB: Beschreibung;FB:Textfeld 1 ;FB: Textfeld 2 ;FB: Textfeld 3;FB: Textfeld 4 ;FB: Textfeld 5 ;M: Primärschlüssel Modul;M: Beschreibung;M: Name;M: Textfeld 1 ;M: Textfeld 2 ;M: Textfeld 3 ;M: Textfeld 4 ;M: Textfeld 5 ;M: Pflicht Semester StS-Primärschlüssel ;M: Wahlpflicht Semester StS-Primärschlüssel ;M: Primärschlüssel Flaggen;M: Beschreibung Flaggen ;M: Textfeld 1 der Flaggen;M 2: Textfeld 2 der Flaggen;M: Textfeld 3 der Flaggen ;M: Textfeld 4 der Flaggen ;M: Textfeld 5 der Flaggen ;M: Primärschlüssel Semester;S: Primärschlüssel Semester ;S: Beschreibung ;S:Textfeld 1 ;S: Textfeld 2 ;S: Textfeld 3 ;S: Textfeld 4 ;S: Textfeld 5;V: Primärschlüssel Veranstaltung;V: Beschreibung ;V: Num. ;V: Alpha-num.;V: Textfeld 1 ;V: Textfeld 2 ;V: Textfeld 3;V: Textfeld 4 ;V: Tag;V: Anfang;V: Ende ;V: Primärschlüssel Flaggen;V: Beschreibung Flaggen;V: Textfeld 1 der Flaggen ;V: Textfeld 2 der Flaggen;V: Textfeld 3 der Flaggen ;V: U-Wochen als Anfangswoche;V: U-Wochen als Anfangsdatum bis Enddatum;A: Primärschlüssel Art ;A: Name Art ;D: Primärschlüssel Dozent ;D: Beschreibung Dozent;D: Name Dozent ;D: Email-Adresse ;D: Eigenschaft Dozent ;D: Textfeld 1 ;D: Textfeld 2 ;D: Textfeld 3 ;D: Textfeld 4;D:Textfeld 5 ;StS: Primärschlüssel Studenten-Sets ;StS: Name zugeordneter Studenten-Sets;StS: leer - Doppelbuchungen ;StS: leer Doppelbuchungen;StS: leer - Doppelbuchungen ;StS: leer - Doppelbuchungen ;StS: leer - Doppelbuchungen ;StS: leer - Doppelbuchungen;R: Primärschlüssel Räume;R: Name;R: Beschreibung ;R: Primärschlüssel Flaggen ;R: Name Flaggen Räume ;R: Beschreibung Flaggen der Räume ;R: Textfeld 1 Flaggen der Räume ;R: Textfeld 2 Flaggen der Räume ;R: Textfeld 3 Flaggen der Räume;R: Textfeld 4 der Flaggen Räume ;R: Textfeld 5 der Flaggen Räume ;Doppelbuchungen der Veranstaltungen als !".split(';')]) | |
# Der Teil des Skriptes, der ausgeführt wird, wenn wir es ausführen. | |
# Guckt, ob irgendwas irgendwas ist, und ruft dann die main-Funktion auf, | |
# übergibt als Argumente die Kommandozeilenargumente minus das erste, | |
# das der Dateiname sein sollte | |
if __name__ == "__main__": | |
main(sys.argv[1:]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment