Skip to content

Instantly share code, notes, and snippets.

@julians
Created November 2, 2010 18:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save julians/660102 to your computer and use it in GitHub Desktop.
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.
#!/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