¿Eliminar el carácter de retorno / nueva línea (\ n) de Field usando Python y Field Calculator?

14

Tengo una tabla de geodatabase con un campo que estoy tratando de eliminar los caracteres de retorno (nueva línea). Encontré esta publicación ( ¿Cómo puedo eliminar (chomp) una nueva línea en Python? ) Sobre cómo hacerlo, sin embargo, no funciona dentro de la calculadora de campo. Aquí están los fragmentos de código que probé: tenga en cuenta que el carácter de retorno no está al final de la cadena .

!myField!.rstrip()

O

!myField!.rstrip('\n')

O

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

O

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

000539 error dado para esta opción:

Descripción El cálculo utilizado por la herramienta Calcular campo o Calcular valor no es válido. Este mensaje de error proporcionado enumerará el error específico de Python.

Solución Este código de error cubre varios errores de Python:

Error de ejemplo 1: excepciones. TypeError: no se pueden concatenar los objetos 'str' e 'int'. Lo anterior es un error específico de Python. El cálculo está intentando agregar o concatenar una cadena y un número.

Error de ejemplo 2: campo inválido forma @ distancia Lo anterior es un error al usar el objeto de geometría. El método de distancia no es un método válido del objeto de geometría.

Para problemas específicos de Python, consulte la ayuda externa de Python para obtener más información, o consulte la ayuda Calcular campo o Calcular valor para obtener más información sobre estas herramientas.

O

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

¿Alguna idea de cómo eliminar caracteres de retorno usando la calculadora de campo?

artwork21
fuente
¿Estás seguro de que es un carácter de nueva línea ("\ n")? ¿Podría ser un retorno de carro ("\ r") en su lugar? Además, ¿todos los valores en todas las filas son alfa, o tal vez está fallando en un valor numérico en uno de los campos? Posiblemente str (! MyField!). Rstrip ('\ n')
RyanKDalton
Publique el rastreo completo de Python con el mensaje de error y el número de línea, no el error de ArcGIS que está recibiendo (que es genérico e inútil).
blah238
Está empezando a parecerse a algo en ArcGIS, porque las diversas respuestas de Python dadas son correctas.
Cindy Jayakumar
¿Estás recibiendo un SyntaxError: EOL while scanning string literalerror?
blah238
No estoy seguro de cómo maneja la calculadora la importación de módulos, pero también puede intentar: import re y use re.sub.
Tomek

Respuestas:

9

Creo que esto es solo un error / limitación del analizador de Python con la herramienta Calculadora de campo / Calcular campo. Si se encuentra una nueva línea dentro del campo de texto, se SyntaxError: EOL while scanning string literalproduce un sin importar lo que intente.

Puedo reproducir el problema en 10.1 SP1 importando el siguiente archivo CSV en una geodatabase de archivos, agregando un campo y simplemente intentando copiar el Textcampo en el nuevo campo usando la Calculadora de campo con el analizador Python y la expresión !Text!.

ID, texto
1, "esta es una línea múltiple 
ejemplo"

Intente cambiar al analizador VB, o use un UpdateCursory evite la Calculadora de campo por completo.

Este tema también se discute en los foros de ESRI, con las mismas conclusiones:

El único NIM relevante que pude encontrar fue este:

  • NIM085499 - Los cálculos de CalculateField que utilizan caracteres no ASCII fallan en un motor Linux con: "ERROR 000539: SyntaxError: EOL al escanear el literal de cadena (, línea 1)".
blah238
fuente
4

Hay dos posibles soluciones que he encontrado confiables. Por alguna razón, CartoPac permite a las personas poner un Retorno en el campo OBSERVACIONES donde trabajo. Para deshacerme de ellos, la solución que he encontrado que funciona mejor es usar la Calculadora de campo.

Cambia tu analizador a Python. Ponga lo siguiente en Pre-Logic Script Code:

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

Ponga lo siguiente en el siguiente cuadro de texto (este está trabajando en un campo llamado OBSERVACIONES):

carriageReturnRemoval( !REMARKS! )

ingrese la descripción de la imagen aquí

Cuando se retiren los retornos de carro, agregará un espacio, -, y un espacio entre cada línea. Puede modificar "-" a un carácter diferente o un conjunto de caracteres si lo desea. Pero he encontrado que esto funciona mejor para mí en función de la forma en que mis equipos de construcción ingresan datos. Es más fácil hacer operaciones de Buscar / Reemplazar si hay patrones de caracteres reconocibles que rompen cada retorno de carro, que usan en el campo para denotar un nuevo atributo (aunque a menudo es un atributo que podrían haber colocado en el campo apropiado) y me salvó el dolor de cabeza en primer lugar).

Si prefiere usar la Consola Python en ArcGIS, puede modificar lo anterior para que funcione. Sin embargo, también he intentado esto con cierto éxito en la consola de 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)  

Reemplace "Assets \ Welds" con el nombre de fc apropiado y reemplace row.REMARKS con row. (Inserte el nombre del campo aquí)

Puede que necesite o no ejecutar las líneas de importación a continuación antes de intentar el ejemplo de código anterior:

import arcpy  
import string
Zachary Ordo - GISP
fuente
Le doy una oportunidad, su declaración después de su declaración if necesita sangría.
artwork21
Buena captura ... no se copió correctamente cuando copié desde el script de la ventana de comandos de Python.
Zachary Ordo - GISP
4

La solución para esto ya que mi tabla de clase de entidad se originó en Excel fue usar el siguiente comando de Excel:

= LIMPIAR

Método para eliminar todos los caracteres de línea de retorno o nuevos. Luego puede unir o importar la tabla a su base de datos SIG.

artwork21
fuente
3

He usado una instrucción SQL para seleccionar primero los nuevos caracteres de línea. En la Select By Attributesventana de diálogo:

"MY_FIELD" LIKE '%
 %'

Tienes que presionar Enterdespués del primer%.

Cindy Jayakumar
fuente
2
Me acabo de dar cuenta de que, si bien esto me mostró dónde estaban los nuevos caracteres de línea, tampoco pude MY_FIELD.strip()trabajar, pero como solo tenía 5 registros, los edité manualmente.
Cindy Jayakumar
Probablemente podría seleccionarlos de esta manera y luego usar la calculadora de campo para volver a calcular los valores con la expresión de Python !MY_FIELD![:-1]: el corte de cadena debe eliminar el carácter de nueva línea (suponiendo que no haya nada después de la nueva línea, que parece ser el caso para el OP) .
nmpeterson
3

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

La calculadora de campo está un poco confundida cuando se trata de secuencias de escape como \ny \t. Solo usa los códigos de caracteres sin procesar.

Jason Scheirer
fuente
Aún obteniendo una SyntaxError: EOL while scanning string literalcon esto. El analizador VB funciona bien.
blah238
¿En la expresión y no en el bloque de código? ¿Y solo en 10.0?
Jason Scheirer
En la expresión, en 10.1 SP1.
blah238
2
myString = "My text\n"

print myString.strip()
Dan
fuente
eso no funcionó en la calculadora de campo.
artwork21
¿Necesita una solución Python o una solución VBA (ArcGIS 9)? strip (), rstrip () y lstrip () solo tratan con caracteres en los extremos. Si está en el medio de una cadena, intente .replace ("\ n", "")
Dan
Sí, necesito una solución de Python dentro de la calculadora de campo. El retorno está dentro de la cadena, no al final. Intenté .replace ("\ n", ""), sin embargo, obtuve un error general 000539.
artwork21
¿Cuál es el error específico de Python dado con este número?
Dan
Mensaje de error publicado en mi pregunta.
artwork21
2

Creo que esto debería funcionar como código de script prelógico en la calculadora de campo, pero desafortunadamente parece que no. Lo publiqué de todos modos en caso de que le brinde un enfoque alternativo que pueda modificar para comenzar a trabajar.

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

Intente ajustar su !field!declaración en la expresión con comillas y un inicializador de cadena sin formato, por ejemplo r"!field!".

Inténtalo str(!field!)también.

blah238
fuente
No funciona También probé el MYFIELD.replace(r"\n",""), but it doesn't see that I've escaped the newline character, it just fails with a error EOL`.
Cindy Jayakumar
Tienes razón, mira mi otra respuesta. Dejando este para la posteridad.
blah238