Datenbank aufräumen

In unserer Datenbank sammeln sich nun einige Einträge an. Und da diese aus verschiedensten Datenquellen stammen kann es durchaus vorkommen, dass einiges nicht stimmt.

Vor allem der Hersteller ist oft leer. Das kommt daher, dass manche den Hersteller einfach beim Typ dazupacken. Einige scheint das nichz zu stören, ich hätte es aber gerne dann doch einheitlich.

Auch hier benutze ich Python auf dem Pi. Der Anfang des Scripts ist mit den anderen vergleichbar und ich spare mir hier den Teil. Im Grunde importieren wir SQLite und verbinden zur Datenbank.

Dann machen wir nichts anders als Datenbankabfragen und Aktualisieren der Daten.

Im weiteren erkläre ich die Funktionen und verzichte auf viel Code. Der kann zur Begutachtung und Benutzung unten heruntergeladen werden. Im Code habe ich die einzelnen Abschnitte mit Kommentaren versehen.

basic_clean

Was ich hier Basic Clean nenne, ist erst mal ein Grundaufräumen. Registrierungen haben teilweise eine Fehlermeldung im Datenbankeintrag. Diese lösche ich.

Uneinheitliche Schreibweisen ersetzte ich, damit die Registrierung immer aus Großbuchstaben besteht.

Und manche Datenquellen liefern Strich (das Minuszeichen) zurück statt Felder leer zu lassen, wenn sie keine Daten haben. Diese ersetze ich.

clean_man

Im nächsten Schritt nehme ich mir die Herstellerspalte vor. Ich habe mir vorher die Datenbank angesehen und manuell geprüft, wo es Probleme gibt. Nachdem diese identifiziert sind, habe ich mir ein Array gebastelt. Grob erklärt besteht jeder Eintrag aus drei Teilen:

search=[ 
["Suchbegriff", "Ersatzbegriff", "Aktion"],
]

Hier stark verkürzt mit den drei Möglichkeiten, die auftreten können:

search=[
["Airbus ", "Airbus", "cut"],
["be20", "Beech", "B200 King Air"],
["a3", "Airbus", ""],
]

Of kommt der dritte Fall vor. Zum Beispiel ist kein Hersteller angegeben, aber im Typ-Feld steht „A320“. In diesem Fall, und bei Durchsicht der Datenbank hier immer, ist ein Flugzeugtyp, der mit „a3“ beginnt – Groß- oder Kleinschreibung egal – ein Airbus. Hier wird einfach der Hersteller gesetzt.

Der erste Fall kommt ab und zu vor. Im Feld Typ steht z.B. „Airbus A320“. Zur Vereinheitlichung nehme ich hier als Suche den ersten Teil „Airbus “ und ersetze ihn durch den zweiten „Airbus“. Mit dem Keyword „cut“ weiß ich, dass der erste Teil vom Typ abgeschnitten werden muss. Wichtig ist hier, auf das Leerzeichen zu achten sonst beginnt der neue Typ mit einem Leerzeichen.

Der zweite Fall macht das ähnlich, doch im dritten Feld steht hier eine neue Bezeichnung. Hier wird nicht nur der Hersteller gesetzt sondern auch die Typenbezeichnung überschrieben.

In meinem Code mache ich das mit Schleifen und if-else:

for j in search:
    statement="SELECT * FROM " + tb + " WHERE manufacturer='' AND type LIKE '" + j[0] + "%'"
    erg=c.execute(statement).fetchall()
    for i in erg:
        man=j[1] # Hersteller ist der zweite Eintrag einer jeweiligen Zeile des Arrays search
        if j[2]=="cut":
            type=i[4][len(j[0]):] # Der alte Typ wird genommen und um die Länge des ersten Eintrags des Arrays search gekürzt
        elif j[2]=="":
            type=i[4] # Der Typ bleibt gleich dem Eintrag aus der Datenhank
        else:
            type=j[2] # oder der Typ wird durch den dritten Eintrag des Arrays search überschrieben
        statement="UPDATE " + tb + " SET manufacturer='" + man + "', type='" + type + "' WHERE icaohex='" + i[1] + "'"
        c.execute(statement)
        c.commit()

So ähnlich mache ich das aus im zweiten Teil der Funktion, hier vereinheitliche ich allerdings Herstellerbezeichnungen.

Im dritten Teil passe ich den Hersteller dem Typ an. So gibt es z.B. noch alte Einträge, in denen ein Airbus A220 mit Bombardier eingetragen ist.

Und im vierten Teil werden Typen vereinheitlicht, bei denen der Hersteller ersetzt werden muss.

clean_type

Im Prinzip wiederholt sich hier das obige. Auf Basis der Spalte Typ werden hier Typen herausgesucht, die mir doch inkonsistente Schreibweise aufgefallen sind. Auch hier arbeite ich mit Keywords um verschiedene Aktionen mit if-else abzufragen.

clean_airline

Zuletzt werden noch einige Schreibweisen bei der Airline angepasst. Z.B. gibt es „Private“ und „Private Owner“ was ich komplett zu „Private“ mache.

Ich hatte eine Zeitlang überlegt, ob ich bei Militärflugzeugen, die Einheiten mit im Airline-Namen haben, dies zu vereinheitlichen.

Also z.B. alle hier aufgeführten durch „German Air Force“ oder sowas zu ersetzen. Vorerst habe ich mit dagegen entschieden.

Fazit

Dieses Script räumt meine Datenbank so auf, dass sie hinterher besser Daten hat. Aus meiner Sicht. Das kann nun jeder für sich selbst entscheiden, ob und wie er das möchte.

Sicher gibt es auch elegantere Lösung, als die Abfragen der Datenbank fest im Script zu hinterlegen. Aber für mich ist das so praktisch.

Soll das Script regelmässig laufen, muss es nur noch, wie im Abschnitte „Daten ergänzen“ erklärt, in den Cron-Job hinzugefügt werden.

Download

Wer nicht abtippen will, der kann hier auch das Python-Script herunterladen.


Beitrag veröffentlicht

in

von

Schlagwörter:

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert