Limpar atributos

8

Eu quero limpar a tabela de atributos de um arquivo de forma de estrada para todas as entradas nos campos.

Por exemplo: Como visto abaixo, tenho um recurso de estrada com um "Nome", Nome de e Nome para na lista de atributos. Na linha selecionada, o nome do segmento é Louis Botha.

O NameFrom também contém esse nome de segmento (Louis Botha & Unknown).

Depois de limpar os dados, só quero que o seguinte seja apresentado nos campos relevantes:

Nome = Louis Botha Nome de = Nome desconhecido Para = Janeke

Existe uma maneira de remover isso nos campos "nome de" e "nome para" para TODOS os atributos?

insira a descrição da imagem aqui

Dean van den Heever
fonte
Então, você quer ficar com "Louis Botha", "& Unknown" e "Janeke &"?
Phloem
Você poderia atualizar sua pergunta para incluir um exemplo da saída limpa?
Aaron
@ phloem: Sim, eu quero ficar com Louis Botha "," & Unknown "e" Janeke. @ Aaron Atualizei a questão para torná-la mais clara.
Dean van den Heever,

Respostas:

2

O script a seguir executa as ações que você está após usar um cursor. Há muita manipulação de erros para lidar com muitos problemas em potencial - remova conforme necessário. Isso altera os dados originais, portanto, execute-o em uma cópia para garantir que os resultados sejam os que você procura. Adicionei comentários no script em vez de destacar aqui.

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)

insira a descrição da imagem aqui

Aaron
fonte
5

Você pode usar a seguinte função Python na 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 o acima na seção codeblock / código de script pré-lógico. Você pode executá-lo uma vez para Name_From usando remove_name(!Name!, !Name_From!)como expressão e uma segunda vez para Name_To usando remove_name(!Name!, !Name_To!).

Esse código funcionará não apenas nos casos em que o valor Name esteja no início ou no final de Name_From / Name_To , mas também naqueles em que estiver no meio. Por exemplo, remove_name('Janeke', 'Hereeniging & Janeke & Willemse')retorna 'Hereeniging & Willemse'. Para que isso funcione, os nomes de entrada devem ser separados por e comercial ( &).

nmpeterson
fonte
Isso limpará todos os atributos de uma só vez ou cada linha individualmente? Desculpe por perguntar, scripts pré-lógicos não muito atualizados.
Dean van den Heever,
A calculadora de campo modifica todos os registros selecionados de um único campo ao mesmo tempo (ou todos os registros da tabela, se nenhum recurso for selecionado).
Nfeterson