STANET Import Wasser - Python-Skript

Funktionsweise der Konvertierung durch die Python Datei csv2pfs_v15.py:

import os import fnmatch def textbereinigen(feld): return "'" + feld.strip() + "'" feldbeschreibungen = {} #Dictionary datenbloecke = [] #Liste/Array CWD = os.getcwd() #get working directory Files = os.listdir(CWD) #get all files for x in Files: # if fnmatch.fnmatch(x,'*.CSV'): # read the entire text at once, no splitting into lines datei = open(x,"r") namenslaenge = len(x) # Length of the string (file name) dateiname = x[0:namenslaenge-4] + ".pfs" ergebnis = '' text = datei.read() textOhneEndabsaetze = text.strip() #entfernt \n ganz oben und unten absaetze = textOhneEndabsaetze.split('\n\n') #in Absaetze unterteilen for absatz in absaetze: zeilen = absatz.split('\n') #in Zeilen unterteilen if zeilen[0][4:22] == 'Feldbeschreibungen': #Feldbeschreibungsbloecke finden blockid = zeilen[0][23:28] #Blockid auf die Zeichen nach Feldbeschreibung setzten zeilen.pop(0) #nicht benoetigte Zeilen weg zeilenlisten = [] for zeile in zeilen: zeilenliste = zeile.split(';') #Liste mit allen Feldern zeilenlisten.append(zeilenliste) #Zu Zeilenlisten hinzufuegen feldbeschreibungen[blockid] = zeilenlisten #Feldbeschreibungen in Dictionary einlesen print 'Feldbeschreibung ' + blockid + ' eingelesen' if zeilen[0][-5:] == 'daten': #Datenbloecke finden ueberschrift = zeilen[0][4:] #UEberschrift fuer Datenbloecke blockid = zeilen[0][4:9] #blockid fuer Datenbloecke zeilen.pop(0) #nicht beoetigte Zeilen weg zeilen.pop(0) zeilen.pop(0) zeilenlisten = [] for zeile in zeilen: zeilenliste = zeile.split(';') # alle Zeilen: zeilenlisten.append(zeilenliste) # Liste der Datenbloecke datenbloecke.append([ueberschrift, blockid, zeilenlisten]) print 'Datenblock ' + ueberschrift + ' eingelesen' for datenblock in datenbloecke: ergebnis = ergebnis + '[' + datenblock[0] + ']\n' #Ergebnis zusammenbauen ergebnis = ergebnis + ' [Metadata]\n' blockid = datenblock[1] # aktuellefeldbeschr ist eine Matrix aktuellefeldbeschr = feldbeschreibungen[blockid] for zeilenliste in aktuellefeldbeschr: breite = int(zeilenliste[5]) + int(zeilenliste[6]) + 1 textzeile = " Field = '" + zeilenliste[3] + "', 'Text(" + str(breite) + ")'\n" #Laenge des benoetigten Datenfeldes berechnen ergebnis = ergebnis + textzeile ergebnis = ergebnis + ' EndSect // Metadata\n\n [Rows]\n' #hardgecodete Formatierung fuer MU print 'Feldbeschreibungen ' + blockid + ' konvertiert.' # Hier fangen die Datenbloecke an aktuellerdatenblock = datenblock[2] # Kopfzeile der Daten zeilenliste = aktuellerdatenblock[0] neuezeile = ' rHeader = ' + textbereinigen(zeilenliste[1]) # anfang zusammenbauen for attribut in zeilenliste[2:]: neuezeile = neuezeile + ', ' + textbereinigen(attribut) ergebnis = ergebnis + neuezeile + '\n' laengehead = len(zeilenliste) #Laenge des Heads auslesen, wird benoetigt, da es in STANET mehr Datenfelder als Headerfelder gibt. # Datenzeilen for zeilenliste in aktuellerdatenblock[1:]: neuezeile = ' r = ' + textbereinigen(zeilenliste[1]) for attribut in zeilenliste[2:laengehead]: #Datenfelder bei der Laenge des Headers abschneiden neuezeile = neuezeile + ', ' + textbereinigen(attribut) ergebnis = ergebnis + neuezeile + '\n' print 'Datenblock ' + datenblock[0] + ' konvertiert.' ergebnis = ergebnis + ' EndSect // Rows \nEndSect // ' + datenblock[0] + ' \n' #Schreiben print 'Schreiben gestartet.' output = open(dateiname,"w") output.write(ergebnis) output.close() print 'Fertig.'