Removendo o caractere de retorno / nova linha (\ n) do Field usando Python e Field Calculator?

14

Eu tenho uma tabela de geodatabase com um campo que estou tentando remover caracteres de retorno (nova linha). Encontrei este post ( como posso remover (chomp) uma nova linha no Python? ) De como fazê-lo, no entanto, ele não está funcionando na calculadora de campo. Aqui estão os trechos de código que eu tentei: O caractere de retorno da nota não está no final da string .

!myField!.rstrip()

OU

!myField!.rstrip('\n')

OU

!myField!.rstrip('\r\n')

OU

!myField!.replace('\n', '')

000539 erro fornecido para esta opção:

Descrição O cálculo usado pela ferramenta Calcular campo ou Calcular valor é inválido. Esta mensagem de erro fornecida listará o erro específico do Python.

Solução Este código de erro abrange vários erros do Python:

Exemplo de erro 1: exceptions.TypeError: não é possível concatenar os objetos 'str' e 'int'. O acima é um erro específico do Python. O cálculo está tentando adicionar ou concatenar uma sequência e um número.

Exemplo de erro 2: Forma do campo inválida @ distância O acima é um erro ao usar o objeto de geometria. O método da distância não é válido para o objeto geometry.

Para problemas específicos do Python, consulte a ajuda externa do Python para obter mais informações ou consulte a ajuda Calcular campo ou Calcular valor para obter mais informações sobre essas ferramentas.

OU

import os
def removeReturn(myField):
  s = myField.rstrip(os.linesep)
  return s

Alguma idéia de como remover caracteres de retorno usando a calculadora de campo?

artwork21
fonte
Tem certeza de que é um caractere de nova linha ("\ n")? Poderia ser um retorno de carro ("\ r")? Além disso, todos os valores em todas as linhas são alfa ou talvez falhem em um valor numérico em um dos campos? Possivelmente str (! MyField!). Rstrip ('\ n')
RyanKDalton
Poste o traceback completo do Python com a mensagem de erro e o número da linha, não o erro do ArcGIS que você está recebendo (o que é genérico e não ajuda).
precisa saber é o seguinte
Está começando a parecer algo no ArcGIS, porque as várias respostas do Python fornecidas estão todas corretas.
Cindy Jayakumar
Você está recebendo um SyntaxError: EOL while scanning string literalerro?
blah238
Não tenho certeza de como a calculadora está lidando com os módulos de importação, mas você também pode tentar: importar re e usar re.sub.
Tomek

Respostas:

9

Eu acho que isso é apenas um bug / limitação do analisador Python com a ferramenta calculadora de campo / Calcular campo. Se uma nova linha for encontrada dentro do campo de texto, SyntaxError: EOL while scanning string literalocorrerá uma, não importa o que você tente.

Posso reproduzir o problema na 10.1 SP1 importando o seguinte arquivo CSV para um geodatabase, adicionando um campo e simplesmente tentando copiar o Textcampo para o novo campo usando a Calculadora de Campos com o analisador Python ee a expressão !Text!.

ID, Texto
1 ", esta é uma multilinha 
exemplo"

Tente mudar para o analisador VB ou use um UpdateCursore evite completamente a calculadora de campo.

Esta questão também é discutida nos fóruns da ESRI, com as mesmas conclusões:

O único NIM relevante que eu pude encontrar foi o seguinte:

  • NIM085499 - Os cálculos do CalculateField usando caracteres não ASCII falham em um mecanismo Linux com: "ERRO 000539: SyntaxError: EOL ao varrer a cadeia de caracteres literal (, linha 1)".
blah238
fonte
4

Há duas soluções possíveis que considero confiáveis. Por alguma razão, o CartoPac permite que as pessoas coloquem um retorno no campo OBSERVAÇÕES onde eu trabalho. Para se livrar deles, a solução que eu encontrei para trabalhar melhor é usar a Calculadora de Campo.

Mude seu analisador para Python. Coloque o seguinte em Código de script pré-lógico:

def carriageReturnRemoval(remark):
    remark = remark.splitlines()
    separator = " -- "
    return separator.join(remark)

Coloque o seguinte na próxima caixa de texto (esta está trabalhando em um campo chamado OBSERVAÇÕES):

carriageReturnRemoval( !REMARKS! )

insira a descrição da imagem aqui

Quando o retorno do seu carro for removido, ele adicionará um espaço, - e um espaço entre cada linha. Você pode modificar "-" para um caractere ou conjunto de caracteres diferente, se desejar. Mas descobri que isso funciona melhor para mim com base na maneira como minhas equipes de construção inserem dados. É mais fácil executar operações Localizar / Substituir se houver padrões de caracteres reconhecíveis que quebram cada retorno de carro, que eles usam no campo para indicar um novo atributo (mesmo que seja um atributo que eles poderiam ter colocado no campo apropriado) e me salvou a dor de cabeça).

Se você preferir usar o Python Console no ArcGIS, pode modificar o acima para funcionar. No entanto, eu também tentei isso com algum sucesso no console Python:

rows = arcpy.UpdateCursor("Assets\Welds")  
for row in rows:  
    hexString = str(row.REMARKS).encode("hex")  
    if "0a" in hexString:  
        hexString = hexString.replace("0a","")  
        row.REMARKS = hexString.decode("hex")  
        rows.updateRow(row)  

Substitua "Assets \ Welds" pelo nome fc apropriado e substitua row.REMARKS pela linha. (Insira o nome do campo aqui)

Você pode ou não precisar executar as linhas de importação abaixo antes de tentar o exemplo de código acima:

import arcpy  
import string
Zachary Ordo - GISP
fonte
Eu dou uma chance, sua declaração após a sua declaração if precisa ser recuada.
precisa saber é o seguinte
Boa captura ... ela não foi copiada corretamente quando copiei do script da janela de comando do Python em funcionamento.
Zachary Ordo - GISP
4

A solução para isso desde que minha tabela de classes de recursos se originou no excel era usar o seguinte comando excel:

= LIMPAR

método para remover todos os caracteres de retorno ou nova linha. Você pode ingressar ou importar a tabela no seu banco de dados GIS.

artwork21
fonte
3

Eu usei uma instrução SQL para selecionar primeiro os novos caracteres de linha. Na Select By Attributesjanela de diálogo:

"MY_FIELD" LIKE '%
 %'

Você precisa pressionar Enterapós o primeiro%.

Cindy Jayakumar
fonte
2
Acabei de perceber que, embora isso me mostrasse onde estavam os novos caracteres de linha, eu também não conseguia MY_FIELD.strip()trabalhar, mas como eu tinha apenas cinco registros, editei-os manualmente.
Cindy Jayakumar
Provavelmente, você pode selecioná-los assim e, em seguida, usar a calculadora de campo para recalcular os valores com a expressão Python !MY_FIELD![:-1]- a fatia da string deve remover o caractere de nova linha (supondo que nada ocorra após a nova linha, o que parece ser o caso do OP) .
Nmpeterson 6/08/14
3

!FieldName!.replace(chr(10), "").replace(chr(13), "")

A calculadora de campo é um pouco confusa quando se trata de escapar de seqüências como \ne \t. Basta usar os códigos de caracteres brutos.

Jason Scheirer
fonte
Ainda estou conseguindo um SyntaxError: EOL while scanning string literalcom isso. O analisador VB funciona bem.
precisa saber é o seguinte
Na expressão e não no bloco de código? E apenas em 10.0?
precisa saber é o seguinte
Na expressão, no 10.1 SP1.
precisa saber é o seguinte
2
myString = "My text\n"

print myString.strip()
Dan
fonte
que não funcionou na calculadora de campo.
artwork21
Você precisa de uma solução Python ou uma solução VBA (ArcGIS 9)? strip (), rstrip () e lstrip () lidam apenas com caracteres nas extremidades. Se estiver no meio de uma seqüência de caracteres, tente .replace ("\ n", "")
Dan Dan
Sim, preciso de uma solução python na calculadora de campo. O retorno está dentro da string e não no final. Tentei .replace ("\ n", ""), mas recebi um erro geral 000539.
artwork21
Qual é o erro específico do Python fornecido com esse número?
21412 Dan
Postado mensagem de erro na minha pergunta.
artwork21
2

Eu acho que isso deve funcionar como código de script pré-lógico na calculadora de campo - mas infelizmente parece que não. Publiquei de qualquer maneira, caso ele ofereça uma abordagem alternativa que você possa ajustar para começar a trabalhar.

def fix(teststring):
    parts = teststring.splitlines()
    newtest = ""
    for part in parts:
        newtest+=part
    return newtest
PolyGeo
fonte
2

Tente agrupar sua !field!declaração na expressão com aspas e um inicializador de string bruto , por exemplo r"!field!".

Tente str(!field!)também.

blah238
fonte
Isso não funciona. Eu também tentei o MYFIELD.replace(r"\n",""), but it doesn't see that I've escaped the newline character, it just fails with a erro EOL`.
Cindy Jayakumar
Você está correto, veja minha outra resposta. Deixando este para a posteridade.
precisa saber é o seguinte