8 votos

Limpiar atributos

Quiero limpiar la tabla de atributos de un shapefile de carreteras para todas las entradas en los campos.

Por ejemplo: como se muestra a continuación, tengo una característica de carretera con un "Nombre", Nombre De y Nombre Para en la lista de atributos. En la fila seleccionada, el nombre del segmento es Louis Botha.

El Nombre De también contiene este nombre de segmento (Louis Botha y Unknown).

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

Nombre = Louis Botha Nombre De = No Conocido Nombre Para = Janeke

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

enter image description here

0 votos

Entonces, ¿quieres quedarte con "Louis Botha", "& Unknown" y "Janeke &"?

0 votos

¿Podrías por favor actualizar tu pregunta para incluir un ejemplo de la salida limpiada?

0 votos

@ phloem: Sí, quiero quedarme con Louis Botha", " & Unknown", y "Janeke. @Aaron He actualizado la pregunta para hacerla más clara.

6voto

Jon M Puntos 206

Puedes usar la siguiente función de Python en 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)

Copia lo anterior en la sección de código de bloque de código/pre-lógica. Puedes 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 de Name 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') devuelve 'Hereeniging & Willemse'. Para que esto funcione, los nombres de entrada deben estar separados por ampersands (&).

0 votos

¿Eliminará esto todos los atributos de una vez o cada línea individualmente? Lo siento por preguntar, no estoy muy al día con la escritura de prelógica.

0 votos

El calculador de campo modifica cada registro seleccionado de un solo campo al mismo tiempo (o todos los registros en la tabla si no se seleccionan funciones).

3voto

Aaron Puntos 25882

El siguiente script realiza las acciones que estás buscando usando un cursor. Hay mucho manejo de errores para lidiar con muchos problemas potenciales, elimina según sea necesario. Esto modifica los datos originales, así que asegúrate de ejecutar esto en una copia para asegurarte de que los resultados son los que buscas. Añadí comentarios en el script en lugar de resaltarlos 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:  # Asegúrate de que no haya datos del tipo None

            # 1) Dividir cadenas por "&" y 2) eliminar espacios en blanco al principio/al final
            cleaned = [x.strip() for x in row[1].split("&")] # Campo "Name_From"
            cleaned2 = [x.strip() for x in row[2].split("&")] # Campo "Name_To"

            # Manejar el campo "Name_From"
            if row[0] in cleaned: # Asegúrate de que "Name" esté en el campo "Name_From"
                cleaned.remove(row[0]) # Eliminar "Name" del campo
                if len(cleaned) > 1:
                    new = ' & '.join(cleaned)
                    row[1] = new
                elif len(cleaned) == 1:
                    row[1] = cleaned[0]
                else:
                    print "Hubo un problema con OID %s" % row[3]

            # Manejar el campo "Name_To"
            if row[0] in cleaned2: # Asegúrate de que "Name" esté en el campo "Name_To"
                cleaned2.remove(row[0]) # Eliminar "Name" del campo
                if len(cleaned2) > 1:
                    new2 = ' & '.join(cleaned2)
                    row[2] = new2
                elif len(cleaned2) == 1:
                    row[2] = cleaned2[0]
                else:
                    print "Hubo un problema con OID %s" % row[3]
        cursor.updateRow(row)

introducir descripción de la imagen aquí

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X