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


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


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 ( &).


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.