Limpiar atributos

8

Quiero limpiar la tabla de atributos de un archivo de forma de carretera para todas las entradas en los campos.

Por ejemplo: como se ve a continuación, tengo una función de carretera con un "Nombre", Nombre desde y Nombre hasta en la lista de atributos. En la fila seleccionada, el nombre del segmento es Louis Botha.

El NameFrom también contiene este nombre de segmento (Louis Botha & Unknown).

Después de limpiar los datos, solo quiero que lo siguiente se presente en los campos relevantes:

Nombre = Louis Botha Nombre De = Nombre desconocido Para = Janeke

¿Hay alguna forma de eliminar esto en los campos "nombre de" y "nombre de" para TODOS los atributos?

ingrese la descripción de la imagen aquí

Dean van den Heever
fuente
Entonces, ¿quieres quedarte con "Louis Botha", "& Desconocido" y "Janeke &"?
floema
¿Podría actualizar su pregunta para incluir un ejemplo de la salida limpia?
Aaron
@ floema: Sí, quiero quedarme con Louis Botha "," & Desconocido "y" Janeke. @ Aaron actualicé la pregunta para que quede más clara.
Dean van den Heever

Respuestas:

2

El siguiente script realiza las acciones que está realizando después de usar un cursor. Hay una gran cantidad de manejo de errores para lidiar con muchos problemas potenciales: elimine según sea necesario. Esto altera los datos originales, así que asegúrese de ejecutar esto en una copia para asegurarse de que los resultados son lo que busca. Agregué comentarios en el guión en lugar de resaltar aquí.

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)

ingrese la descripción de la imagen aquí

Aaron
fuente
5

Puede usar la siguiente función de Python en la Calculadora de campo.

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)

Copie lo anterior en la sección de código de script de codeblock / pre-logic. Puede ejecutarlo una vez para Name_From usando remove_name(!Name!, !Name_From!)como expresión, y una segunda vez para Name_To usando remove_name(!Name!, !Name_To!).

Este código funcionará no solo para los casos en que el valor del Nombre está al principio o al final de Name_From / Name_To , sino también para aquellos en los que está en el medio. Por ejemplo, remove_name('Janeke', 'Hereeniging & Janeke & Willemse')vuelve 'Hereeniging & Willemse'. Para que esto funcione, los nombres de entrada deben estar separados por ampersands ( &).

nmpeterson
fuente
¿Esto limpiará todos los atributos de una vez o cada línea individualmente? Perdón por preguntar, no muy actualizado scripting prelogic.
Dean van den Heever
La calculadora de campo modifica todos los registros seleccionados de un solo campo al mismo tiempo (o todos los registros de la tabla si no se seleccionan características).
nmpeterson