Attribute bereinigen


8

Ich möchte die Attributtabelle eines Straßen-Shapefiles für alle Einträge in den Feldern bereinigen.

Zum Beispiel: Wie unten gezeigt, habe ich eine Straßenfunktion mit einem "Namen", einem Namen von und einem Namen bis in der Attributliste. In der ausgewählten Zeile heißt das Segment Louis Botha.

Der NameFrom enthält auch diesen Segmentnamen (Louis Botha & Unknown).

Nachdem ich die Daten bereinigt habe, möchte ich nur Folgendes in den relevanten Feldern anzeigen:

Name = Louis Botha Name Von = Unbekannter Name Bis = Janeke

Gibt es eine Möglichkeit, dies in den Feldern "Name von" und "Name bis" für ALLE Attribute zu entfernen?

Geben Sie hier die Bildbeschreibung ein


Sie möchten also mit "Louis Botha", "& Unknown" und "Janeke &" zurückbleiben?
Phloem

Könnten Sie bitte Ihre Frage aktualisieren, um ein Beispiel für die bereinigte Ausgabe aufzunehmen?
Aaron

@ phloem: Ja, ich möchte mit Louis Botha "," & Unknown "und" Janeke "zurückbleiben. @ Aaron Ich habe die Frage aktualisiert, um es klarer zu machen.
Dean van den Heever

Antworten:


2

Das folgende Skript führt die Aktionen aus, die Sie nach Verwendung eines Cursors ausführen. Es gibt eine Menge Fehlerbehandlung, um viele potenzielle Probleme zu lösen - entfernen Sie sie nach Bedarf. Dadurch werden die Originaldaten geändert. Führen Sie diese also auf einer Kopie aus, um sicherzustellen, dass die Ergebnisse Ihren Wünschen entsprechen. Ich habe dem Skript Kommentare hinzugefügt, anstatt sie hier hervorzuheben.

import arcpy, os

fc = r'C:\temp\test.gdb\test_1'

with arcpy.da.UpdateCursor(fc, ["Name", "Name_From", "Name_To", "OID@"]) as cursor:
    for row in cursor:
        if row[0] != None:  # Make sure there are no None type data

            # 1) Split strings by "&" and 2) remove leading/tailing white space
            cleaned = [x.strip() for x in row[1].split("&")] # "Name_From" field
            cleaned2 = [x.strip() for x in row[2].split("&")] # "Name_To" field

            # Tackling the "Name_From" field
            if row[0] in cleaned: # Make sure "Name" is in "Name_From" field
                cleaned.remove(row[0]) # Remove "Name" from field
                if len(cleaned) > 1:
                    new = ' & '.join(cleaned)
                    row[1] = new
                elif len(cleaned) == 1:
                    row[1] = cleaned[0]
                else:
                    print "There was a problem with OID %s" % row[3]

            # Tackling the "Name_To" field
            if row[0] in cleaned2: # Make sure "Name" is in "Name_To" field
                cleaned2.remove(row[0]) # Remove "Name" from field
                if len(cleaned2) > 1:
                    new2 = ' & '.join(cleaned2)
                    row[2] = new2
                elif len(cleaned2) == 1:
                    row[2] = cleaned2[0]
                else:
                    print "There was a problem with OID %s" % row[3]
        cursor.updateRow(row)

Geben Sie hier die Bildbeschreibung ein


5

Sie können die folgende Python-Funktion im Feldrechner verwenden.

def remove_name(name_value, from_to_value):
    streets = [street.strip() for street in from_to_value.split('&') if street.strip() != name_value.strip()]
    return ' & '.join(streets)

Kopieren Sie das Obige in den Codeblock Codeblock / Pre-Logic Script. Sie können es einmal laufen Name_From Verwendung remove_name(!Name!, !Name_From!)als Ausdruck, und ein zweites Mal für Name_To mit remove_name(!Name!, !Name_To!).

Dieser Code funktioniert nicht nur in Fällen, in denen sich der Name- Wert am Anfang oder Ende von Name_From / Name_To befindet , sondern auch in Fällen , in denen er sich in der Mitte befindet. Gibt zum Beispiel remove_name('Janeke', 'Hereeniging & Janeke & Willemse')zurück 'Hereeniging & Willemse'. Damit dies funktioniert, werden die Eingangsnamen müssen durch Et - Zeichen getrennt werden ( &).


Bereinigt dies alle Attribute auf einmal oder jede Zeile einzeln? Tut mir leid, dass ich gefragt habe, nicht sehr aktuelles Prelogic-Scripting.
Dean van den Heever

Der Feldrechner ändert jeden ausgewählten Datensatz eines einzelnen Felds gleichzeitig (oder alle Datensätze in der Tabelle, wenn keine Features ausgewählt sind).
nmpeterson
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.