Rimozione del carattere return / newline (\ n) da Field utilizzando Python e Field Calculator?


14

Ho una tabella di geodatabase con un campo che sto cercando di rimuovere i caratteri di ritorno (nuova riga). Ho trovato questo post ( Come posso rimuovere (chomp) una nuova riga in Python? ) Di come farlo, tuttavia non funziona all'interno del calcolatore di campo. Ecco i frammenti di codice che ho provato: Nota il carattere restituito non si trova alla fine della stringa .

!myField!.rstrip()

O

!myField!.rstrip('\n')

O

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

O

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

000539 errore fornito per questa opzione:

Descrizione Il calcolo utilizzato dallo strumento Calcola campo o Calcola valore non è valido. Questo messaggio di errore fornito elencherà l'errore Python specifico.

Soluzione Questo codice di errore copre una serie di errori Python:

Esempio di errore 1: exceptions.TypeError: impossibile concatenare gli oggetti 'str' e 'int'. Quanto sopra è un errore specifico di Python. Il calcolo sta tentando di aggiungere o concatenare una stringa e un numero.

Esempio di errore 2: forma campo non valida @ distanza Quanto sopra è un errore nell'uso dell'oggetto geometria. Il metodo della distanza non è un metodo valido dell'oggetto geometria.

Per problemi specifici di Python, consultare la guida Python esterna per ulteriori informazioni o consultare la guida Calcola campo o Calcola valore per ulteriori informazioni su questi strumenti.

O

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

Qualche idea su come rimuovere i caratteri di ritorno usando il calcolatore di campo?


Sei sicuro che sia un carattere di nuova riga ("\ n")? Potrebbe invece essere un ritorno a capo ("\ r") invece? Inoltre, tutti i valori in tutte le righe sono alfa o forse non funzionano su un valore numerico in uno dei campi? Forse str (! MyField!). Rstrip ('\ n')
RyanKDalton

Si prega di pubblicare il traceback completo di Python con il messaggio di errore e il numero di riga, non l'errore ArcGIS che si sta ottenendo (che è generico e non utile).
blah238,

Sta iniziando a sembrare qualcosa in ArcGIS stesso, perché le varie risposte di Python fornite sono tutte corrette.
Cindy Jayakumar,

Stai ricevendo un SyntaxError: EOL while scanning string literalerrore?
blah238,

Non sono sicuro di come la calcolatrice stia gestendo i moduli di importazione, ma puoi anche provare: import re and use re.sub.
Tomek,

Risposte:


9

Penso che questo sia solo un bug / limitazione del parser Python con lo strumento calcolatrice / Calcola campo. Se viene trovata una nuova riga all'interno del campo di testo, a si SyntaxError: EOL while scanning string literalverifica qualunque cosa tu provi.

Posso riprodurre il problema a 10.1 SP1 importando il seguente file CSV in un file geodatabase, aggiungendo un campo e semplicemente tentando di copiare il Textcampo nel nuovo campo utilizzando il calcolatore di campo con il parser Python e l'espressione !Text!.

ID, testo
1, "questa è una multilinea 
esempio"

Prova a passare al parser VB, oppure usa un UpdateCursored evitando del tutto il Field Calculator.

Questo problema è anche discusso nei forum ESRI, con le stesse conclusioni:

L'unico NIM rilevante che ho trovato è stato questo:

  • NIM085499 - I calcoli di CalculateField che utilizzano caratteri non ASCII hanno esito negativo su un motore Linux con: "ERRORE 000539: SintassiErrore: EOL durante la scansione di stringhe letterali (, riga 1)".

4

Ci sono due possibili soluzioni che ho trovato affidabili. Per qualche motivo CartoPac consente alle persone di inserire un Ritorno nel campo OSSERVAZIONI in cui lavoro. Per sbarazzarsi di quelli, la soluzione che ho trovato funzionare meglio è usare il Field Calculator.

Cambia il tuo parser in Python. Inserisci quanto segue nel codice di script pre-logico:

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

Inserisci quanto segue nella casella di testo successiva (questa funziona su un campo chiamato REMARKS):

carriageReturnRemoval( !REMARKS! )

inserisci qui la descrizione dell'immagine

Quando i ritorni a capo vengono rimossi, verrà aggiunto uno spazio, - e uno spazio tra ogni riga. Se lo desideri, puoi modificare "-" in un diverso personaggio o set di caratteri. Ma ho trovato che questo funziona meglio per me in base al modo in cui i miei team di costruzione inseriscono i dati. È più facile eseguire le operazioni Trova / Sostituisci se ci sono modelli di caratteri riconoscibili che interrompono ogni ritorno a capo, che usano nel campo per indicare un nuovo attributo (anche se spesso è un attributo che avrebbero potuto semplicemente inserire nel campo appropriato e mi ha salvato il mal di testa in primo luogo).

Se preferisci utilizzare la console Python in ArcGIS, puoi modificare quanto sopra per farlo funzionare. Tuttavia ho anche provato questo con un certo successo nella 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)  

Sostituisci "Risorse \ Saldature" con il nome fc appropriato e sostituisci row.REMARKS con la riga. (Inserisci qui il nome del campo)

Potrebbe essere necessario o meno eseguire le righe di importazione seguenti prima di provare l'esempio di codice sopra:

import arcpy  
import string

Ci provo, la tua affermazione dopo la tua if ha bisogno di rientrare.
artwork21

Buona cattura ... non è stato copiato correttamente quando ho copiato dallo script della finestra di comando di Python funzionante.
Zachary Ordo - GISP

4

Per ovviare a questo, poiché la mia tabella delle classi di caratteristiche originata in Excel era di utilizzare il seguente comando Excel:

= PULITO

metodo per rimuovere tutti i caratteri di ritorno o di nuova riga. È quindi possibile unire o importare la tabella nel database GIS.


3

Ho usato un'istruzione SQL per selezionare prima i nuovi caratteri di linea. Nella Select By Attributesfinestra di dialogo:

"MY_FIELD" LIKE '%
 %'

Devi premere Enterdopo il primo%.


2
Mi sono appena reso conto che, mentre questo mi mostrava i caratteri della nuova linea, non potevo nemmeno MY_FIELD.strip()lavorare, ma poiché avevo solo 5 record, li ho modificati manualmente.
Cindy Jayakumar,

Probabilmente potresti selezionarli in questo modo e quindi usare il calcolatore di campo per ricalcolare i valori con l'espressione Python !MY_FIELD![:-1]- la stringa di stringa dovrebbe rimuovere il carattere di nuova riga (supponendo che nulla arrivi dopo la nuova riga, che sembra essere il caso dell'OP) .
nmpeterson

3

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

Il calcolatore di campo è un po 'confuso quando si tratta di sfuggire a sequenze come \ne \t. Usa solo i codici dei caratteri grezzi.


Ci sto ancora provando SyntaxError: EOL while scanning string literal. Il parser VB funziona bene.
blah238,

Nell'espressione e non nel blocco di codice? E solo su 10.0?
Jason Scheirer il

Nell'espressione, su 10.1 SP1.
blah238,

2
myString = "My text\n"

print myString.strip()

che non ha funzionato nel calcolatore di campo.
artwork21

Hai bisogno di una soluzione Python o una soluzione VBA (ArcGIS 9)? strip (), rstrip () e lstrip () si occupano solo dei caratteri alle estremità. Se è nel mezzo di una stringa, prova .replace ("\ n", "")
Dan

Sì, ho bisogno di una soluzione Python nel calcolatore di campo. Il ritorno è all'interno della stringa non alla fine. Ho provato .replace ("\ n", ""), tuttavia ho riscontrato un errore generale 000539.
artwork21

Qual è l'errore Python specifico fornito con questo numero?
Dan,

Messaggio di errore pubblicato nella mia domanda.
artwork21

2

Penso che questo dovrebbe funzionare come codice di script pre-logico nel calcolatore di campo - ma sfortunatamente sembra non farlo. L'ho pubblicato comunque nel caso in cui ti dia un approccio alternativo che puoi modificare per iniziare a lavorare.

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

2

Prova a racchiudere la tua !field!dichiarazione nell'espressione tra virgolette e un inizializzatore di stringhe non elaborate, ad es r"!field!".

Prova str(!field!)anche tu.


Non funziona Ho anche provato MYFIELD.replace(r"\n",""), but it doesn't see that I've escaped the newline character, it just fails with a l'errore EOL`.
Cindy Jayakumar,

Hai ragione, vedi la mia altra risposta. Lasciando questo per i posteri.
blah238,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.