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


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


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.