Seite 1 von 1

String aus Datei in Datenbank

Verfasst: Dienstag 24. April 2012, 13:56
von puba
Hallo,
aus einer Text-Datei (aus einem Messgerät), möchte ich Messwerte und Beschreibungen in eine MySQL-Datenbank schreiben.
Die Text-Datei hat folgenden Aufbau:
***************
MODEL 6500-02

TEST NUMBER 100
DATE 14-MAR-12
APP NO WACKER
TEST MODE 150 AUTO
SITE WACKER CHE
VISUAL CHECK P
BOND RANGE 10A
EARTH 0.11 OHM P
LIMIT 0.30 OHM
INS 1 >299.9 MEG P
LIMIT 1.0 MEG
SUBST 1 0.54 mA P
LIMIT 3.50 mA
DES1 LADEGERÄT ÖK
DES2 ON-W LADETEC
DES3 HNIK 36V
LOC1 HDK
LOC2
TEXT1 TENNANT
TEXT2
********************
Diese ist z.Z. ca. 100 Messwerte lang.

Nun habe ich versucht, mittels folgendem Script eine Auswertung vorzunehmen:

Code: Alles auswählen

import string
a = ["TEST NUMBER", "DATE", "APP NO", "TEST MODE", "SITE",
     "VISUAL CHECK", "BOND RANGE", "EARTH", "INS 1", "SUBST",
     "DES1", "DES2", "DES3", "LOC1", "LOC2", "TEXT1", "TEXT2"]

b = ["Nr","Datum","Bezeichnung","Modus","Anlage","Sichtp","Messb","R_Schutzl",
     "Isolation","Ableitstr","Gerät1","Gerät2","Gerät3","Standort1","Standort2", "Text1", "Text2"]


path = input("Bitte Datei mit Verzechinis eingeben: ")
print
print '%2s %7s %14s %10s %8s %6s %6s %6s %12s %12s %12s %10s %10s %8s %10s %10s %10s' \
% (b[0],b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8],b[9],b[10],b[11],b[12],b[13],b[14],b[15],b[16])

with open(path,"r") as  file:
        for line in file:
                if line[0:len(a[0])] in a[0]:
                        print line[len(a[0])+1:len(line)-2],

                elif line[0:len(a[1])] in a[1]:
                        print line[len(a[1])+1:len(line)-2],
                                        
                elif line[0:len(a[2])] in a[2]:
                        print line[len(a[2])+1:len(line)-2],
                                        
                elif line[0:len(a[3])] in a[3]:
                        print line[len(a[3])+1:len(line)-2],
                
                elif line[0:len(a[4])] in a[4]:
                        print line[len(a[4])+1:len(line)-2],
                
                elif line[0:len(a[5])] in a[5]:
                        print line[len(a[5])+1:len(line)-2],
                
                elif line[0:len(a[6])] in a[6]:
                        print line[len(a[6])+1:len(line)-2],

                elif line[0:len(a[7])] in a[7]:
                        print line[len(a[7])+1:len(line)-2],

                elif line[0:len(a[8])] in a[8]:
                        print line[len(a[8])+1:len(line)-2],

                elif line[0:len(a[9])] in a[9]:
                        print line[len(a[9])+1:len(line)-2],

                elif line[0:len(a[10])] in a[10]:
                        print line[len(a[10])+1:len(line)-2],

                elif line[0:len(a[11])] in a[11]:
                        print line[len(a[11])+1:len(line)-2],

                elif line[0:len(a[12])] in a[12]:
                        print line[len(a[12])+1:len(line)-2],

                elif line[0:len(a[13])] in a[13]:
                        print line[len(a[13])+1:len(line)-2],

                elif line[0:len(a[14])] in a[14]:
                        print line[len(a[14])+1:len(line)-2]
                        
                elif line[0:len(a[15])] in a[15]:
                        print line[len(a[15])+1:len(line)-2]

                elif line[0:len(a[16])] in a[16]:
                        print line[len(a[16])+1:len(line)-2]                




Sicher ist das mit den vielen "elif" nicht die optimale Lösung, vielleich hat jemand einen Tip wie ich das verbessern kann.

Wass muss ich nach den "print line"-Anweisungen einfügen, um diese Werte in eine Datenbanktabelle mit den gleichen Spalten win in "b",
mittel INSERT- Anweisung einzufügen.
Datenbank-Verbindung ist nicht das Thema, das habe ich innen einem anderen Progamm (myconnect.py) realisiert.

Gruß

Armin

Re: String aus Datei in Datenbank

Verfasst: Dienstag 24. April 2012, 15:13
von sparrow
Immer dann wenn man irgend etwas hochzählt ist der Einsatz eine Schleife wahrscheinlich angebracht.

Wenn man dabei auch noch die Felder eines Arrays abläuft ist es angebracht direkt über die Elemente zu iterieren (siehe for-Schleife, du hast sie hier ja schon für die Zeilen der Datei verwendet, solltest also wissen was sie tut).

Jeder String hat die Methode .startswith(anotherstring) der prüft ob der String mit einer bestimmten Zeichenfolge beginnt.

Re: String aus Datei in Datenbank

Verfasst: Dienstag 24. April 2012, 15:52
von /me
Im wesentlichen geht es dir also darum die Daten zu sammeln und in eine Datenbank zu werfen. Dazu bietet sich ein Dictionary an.

Code: Alles auswählen

import io

keywords = [
    'TEST NUMBER', 'DATE', 'APP NO', 'TEST MODE', 'SITE',
    'VISUAL CHECK', 'BOND RANGE', 'EARTH', 'INS 1', 'SUBST',
    'DES1', 'DES2', 'DES3', 'LOC1', 'LOC2', 'TEXT1', 'TEXT2']

fp = io.StringIO(u"""***************
MODEL 6500-02

TEST NUMBER 100
DATE 14-MAR-12
APP NO WACKER
TEST MODE 150 AUTO
SITE WACKER CHE
VISUAL CHECK P
BOND RANGE 10A
EARTH 0.11 OHM P
LIMIT 0.30 OHM
INS 1 >299.9 MEG P
LIMIT 1.0 MEG
SUBST 1 0.54 mA P
LIMIT 3.50 mA
DES1 LADEGERÄT ÖK
DES2 ON-W LADETEC
DES3 HNIK 36V
LOC1 HDK
LOC2
TEXT1 TENNANT
TEXT2
********************""")

model = {}
for line in fp:
    if line.startswith('*'):
        print model
        model = {}
    for keyword in keywords:
        if line.startswith(keyword):
            model[keyword] = line[len(keyword):].strip()
    pass
print model
Ich habe jetzt mal vorausgesetzt, dass die einzelnen Abschnitte mit den Sternchen-Zeilen getrennt werden. Sollte es stattdessen eine Zeile sein, die mit dem Wort MODEL beginnt, dann ist der Code entsprechend anzupassen.
An den Stellen mit print model hast du dann alle Daten vollständig vorliegen und kannst dort die Funktion aufrufen, die sie in die Datenbank überträgt.

Sollte es bei den Schlüsselwörtern mal zu einer Konstellation kommen in der der Beginn eines Schlüsselwortes gleich einem anderen ist ("TEXT", "TEXT 1"), dann musst du beim Ersetzen aufpassen. Das kürzewre Schlüsselwort gehört dann hinten in die Liste. Das lässt sich bei Bedarf natürlich automatisieren.

Code: Alles auswählen

keywords.sort(key=lambda x: len(x[0]), reverse=True)