Page Title

Benutzer-Werkzeuge

Webseiten-Werkzeuge


mikeurban:anleitungen:import_stanet-pythonskript

STANET Import Wasser – Python-Skript

Diese Seite zeigt das Python-Skript "csv2pfs_v15.py" zum Umwandeln des STANET CSV-Formats in das PFS-Format von DHI. Das Skript wird beim Import von Rohrnetzdaten aus STANET verwendet.1)

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.'
1)
Wenn Sie mit der rechten Maustaste auf den blauen Link im Reiter klicken, können Sie das Skript als Datei herunterladen.
mikeurban/anleitungen/import_stanet-pythonskript.txt · Zuletzt geändert: 2016/03/29 12:39 von thomas