Nettoyer les attributs

8

Je veux nettoyer la table d'attributs d'un fichier de formes de route pour toutes les entrées dans les champs.

Par exemple: comme indiqué ci-dessous, j'ai une entité routière avec un "nom", un nom de et un nom à dans la liste d'attributs. Dans la ligne sélectionnée, le nom du segment est Louis Botha.

Le NameFrom contient également ce nom de segment (Louis Botha & Unknown).

Après avoir nettoyé les données, je souhaite uniquement que les éléments suivants soient présentés dans les champs appropriés:

Nom = Louis Botha Nom De = Nom inconnu À = Janeke

Existe-t-il un moyen de supprimer cela dans les champs "nom de" et "nom de" pour TOUS les attributs?

entrez la description de l'image ici

Dean van den Heever
la source
Donc, vous voulez vous retrouver avec "Louis Botha", "& Unknown" et "Janeke &"?
phloème
Pourriez-vous s'il vous plaît mettre à jour votre question pour inclure un exemple de la sortie nettoyée?
Aaron
@ phloem: Oui, je veux rester avec Louis Botha "," & Unknown "et" Janeke. @Aaron J'ai mis à jour la question pour la rendre plus claire.
Dean van den Heever

Réponses:

3

Le script suivant exécute les actions que vous effectuez après avoir utilisé un curseur. Il y a beaucoup de gestion des erreurs pour faire face à de nombreux problèmes potentiels - supprimez-les si nécessaire. Cela modifie les données d'origine, alors assurez-vous de l'exécuter sur une copie pour vous assurer que les résultats correspondent à ce que vous recherchez. J'ai ajouté des commentaires dans le script plutôt que de le souligner ici.

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)

entrez la description de l'image ici

Aaron
la source
6

Vous pouvez utiliser la fonction Python suivante dans Field Calculator.

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)

Copiez ce qui précède dans la section de code de script blocbloc / pré-logique. Vous pouvez l'exécuter une fois pour Name_From en utilisant remove_name(!Name!, !Name_From!)comme expression et une deuxième fois pour Name_To en utilisant remove_name(!Name!, !Name_To!).

Ce code fonctionnera non seulement pour les cas où la valeur Name est au début ou à la fin de Name_From / Name_To , mais aussi pour ceux où elle se trouve au milieu. Par exemple, remove_name('Janeke', 'Hereeniging & Janeke & Willemse')renvoie 'Hereeniging & Willemse'. Pour que cela fonctionne, les noms d'entrée doivent être séparés par des esperluettes ( &).

nmpeterson
la source
Est-ce que cela nettoiera tous les attributs en une seule fois ou chaque ligne individuellement? Désolé de demander, pas de script prélogique très à jour.
Dean van den Heever
La calculatrice de champ modifie simultanément chaque enregistrement sélectionné d'un seul champ (ou tous les enregistrements de la table si aucune fonction n'est sélectionnée).
nmpeterson