Entfernen des Return / Newline-Zeichens (\ n) aus Field mit Python und Field Calculator?

14

Ich habe eine Geodatabase-Tabelle mit einem Feld, in dem ich Rückgabezeichen entfernen möchte (neue Zeile). Ich habe in diesem Beitrag ( Wie kann ich einen Zeilenumbruch in Python entfernen (chomp)? ) Erfahren, wie das geht, aber es funktioniert nicht im Feldrechner . Hier sind die Codefragmente, die ich ausprobiert habe: Beachten Sie, dass das Rückgabezeichen nicht am Ende der Zeichenfolge steht .

!myField!.rstrip()

ODER

!myField!.rstrip('\n')

ODER

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

ODER

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

000539 Fehler für diese Option angegeben:

Beschreibung Die vom Werkzeug "Feld berechnen" oder "Wert berechnen" verwendete Berechnung ist ungültig. Diese Fehlermeldung listet den spezifischen Python-Fehler auf.

Lösung Dieser Fehlercode deckt eine Reihe von Python-Fehlern ab:

Beispielfehler 1: Ausnahmen.TypeError: Objekte 'str' und 'int' können nicht verkettet werden. Das Obige ist ein Python-spezifischer Fehler. Die Berechnung versucht, eine Zeichenfolge und eine Zahl hinzuzufügen oder zu verketten.

Beispielfehler 2: Ungültige Feldform bei Abstand Das obige Beispiel ist ein Fehler beim Verwenden des Geometrieobjekts. Die Distanzmethode ist keine gültige Methode des Geometrieobjekts.

Weitere Informationen zu bestimmten Python-Problemen finden Sie in der externen Python-Hilfe. Weitere Informationen zu diesen Tools finden Sie in der Hilfe zum Berechnen von Feldern oder Werten.

ODER

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

Irgendwelche Ideen, wie man zurückgegebene Zeichen mit dem Feldrechner entfernt?

artwork21
quelle
Sind Sie sicher, dass es sich um ein Newline-Zeichen handelt ("\ n")? Könnte es sich stattdessen möglicherweise um einen Wagenrücklauf ("\ r") handeln? Sind auch alle Werte in allen Zeilen Alpha oder schlägt dies möglicherweise bei einem numerischen Wert in einem der Felder fehl? Möglicherweise str (! MyField!). Rstrip ('\ n')
RyanKDalton-OffTheGridMaps
Veröffentlichen Sie den vollständigen Python-Traceback mit der Fehlermeldung und der Zeilennummer, nicht den ArcGIS-Fehler, den Sie erhalten (der allgemein und nicht hilfreich ist).
blah238
In ArcGIS selbst sieht es schon nach etwas aus, da die verschiedenen Python-Antworten alle richtig sind.
Cindy Jayakumar
Erhalten Sie eine SyntaxError: EOL while scanning string literalFehlermeldung?
blah238
Ich bin nicht sicher, wie der Taschenrechner mit dem Importieren von Modulen umgeht, aber Sie können auch versuchen: re importieren und re verwenden.
Tomek

Antworten:

9

Ich denke, dies ist nur ein Fehler / eine Einschränkung des Python-Parsers mit dem Feldrechner / Feld berechnen-Werkzeug. Wenn im Textfeld ein Zeilenumbruch SyntaxError: EOL while scanning string literalauftritt , geschieht dies unabhängig davon, was Sie versuchen.

Ich kann das Problem mit 10.1 SP1 reproduzieren, indem ich die folgende CSV-Datei in eine File-Geodatabase importiere, ein Feld hinzufüge und einfach versuche Text, das Feld mit dem Feldrechner mit dem Python-Parser und und dem Ausdruck in das neue Feld zu kopieren !Text!.

ID, Text
1, "dies ist eine mehrzeilige 
Beispiel"

Versuchen Sie, zum VB-Parser zu wechseln, oder verwenden Sie einen UpdateCursorund vermeiden Sie den Feldrechner vollständig.

Dieses Problem wird auch in den ESRI-Foren mit den gleichen Schlussfolgerungen erörtert:

Das einzige relevante NIM, das ich finden konnte, war folgendes:

  • NIM085499 - CalculateField-Berechnungen mit Nicht-ASCII-Zeichen schlagen auf einer Linux-Engine mit folgendem Fehler fehl: "ERROR 000539: SyntaxError: EOL beim Scannen des Zeichenfolgenliteral (Zeile 1)".
blah238
quelle
4

Es gibt zwei mögliche Lösungen, die sich als zuverlässig erwiesen haben. Aus irgendeinem Grund erlaubt CartoPac den Leuten, einen Return in das Feld REMARKS zu setzen, in dem ich arbeite. Um diese zu beseitigen, benutze ich den Feldrechner als die Lösung, die ich für am besten befunden habe.

Ändern Sie Ihren Parser in Python. Fügen Sie Folgendes in den Pre-Logic Script Code ein:

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

Geben Sie Folgendes in das nächste Textfeld ein (dieses Feld bearbeitet ein Feld mit dem Namen BEMERKUNGEN):

carriageReturnRemoval( !REMARKS! )

Bildbeschreibung hier eingeben

Wenn Ihr Wagenrücklauf entfernt wird, werden ein Leerzeichen, - und ein Leerzeichen zwischen den Zeilen eingefügt. Sie können "-" in ein anderes Zeichen oder einen anderen Zeichensatz ändern, wenn Sie möchten. Aber ich habe festgestellt, dass dies am besten für mich funktioniert, basierend auf der Art und Weise, wie meine Konstruktionsteams Daten eingeben. Es ist einfacher, Suchen / Ersetzen-Operationen durchzuführen, wenn erkennbare Zeichenmuster vorhanden sind, die jeden Wagenrücklauf aufbrechen und die sie im Feld verwenden, um ein neues Attribut zu kennzeichnen und hat mir die Kopfschmerzen erspart).

Wenn Sie die Python-Konsole in ArcGIS verwenden möchten, können Sie die obigen Einstellungen ändern, damit sie funktionieren. Ich habe dies jedoch auch mit einigem Erfolg in der Python-Konsole versucht:

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)  

Ersetzen Sie "Assets \ Welds" durch den entsprechenden fc-Namen und ersetzen Sie row.REMARKS durch row. (Geben Sie hier den Feldnamen ein.)

Möglicherweise müssen Sie die folgenden Importzeilen ausführen, bevor Sie das obige Codebeispiel ausführen können:

import arcpy  
import string
Zachary Ordo - GISP
quelle
Ich probiere es aus, Ihre Aussage muss nach Ihrer if-Aussage eingerückt werden.
Artwork21
Guter Fang ... es wurde nicht richtig kopiert, als ich es aus dem funktionierenden Python-Befehlsfensterskript kopierte.
Zachary Ordo - GISP
4

Da meine Feature-Class-Tabelle in Excel erstellt wurde, bestand die Problemumgehung darin, den folgenden Excel-Befehl zu verwenden:

= SAUBER

Methode zum Entfernen aller Rückgabe- oder Zeilenumbrüche. Anschließend können Sie die Tabelle verbinden oder in Ihre GIS-Datenbank importieren.

artwork21
quelle
3

Ich habe eine SQL-Anweisung verwendet, um zuerst die neuen Zeilenzeichen auszuwählen. Im Select By AttributesDialogfenster:

"MY_FIELD" LIKE '%
 %'

Sie müssen Enternach dem ersten% drücken .

Cindy Jayakumar
quelle
2
Mir ist gerade aufgefallen, dass ich, obwohl dies mir zeigte, wo sich die neuen Zeilenzeichen befanden, auch nicht MY_FIELD.strip()zur Arbeit kommen konnte, aber weil ich nur 5 Datensätze hatte, habe ich sie manuell bearbeitet.
Cindy Jayakumar
Sie könnten sie wahrscheinlich so auswählen und dann !MY_FIELD![:-1]den Feldrechner verwenden, um die Werte mit dem Python-Ausdruck neu zu berechnen. Das Zeichenfolgen-Slice sollte das Zeilenumbruch-Zeichen entfernen (vorausgesetzt, nach dem Zeilenumbruch kommt nichts, was für das OP der Fall zu sein scheint). .
nmpeterson
3

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

Feldrechner ist etwas verwirrt, wenn es um Escape-Sequenzen wie \nund geht \t. Verwenden Sie einfach die rohen Zeichencodes.

Jason Scheirer
quelle
Immer noch ein SyntaxError: EOL while scanning string literalmit diesem. VB-Parser funktioniert gut.
blah238
Im Ausdruck und nicht im Codeblock? Und nur auf 10.0?
Jason Scheirer
Im Ausdruck auf 10.1 SP1.
blah238
2
myString = "My text\n"

print myString.strip()
Dan
quelle
das hat im feldrechner nicht geklappt.
Artwork21
Benötigen Sie eine Python-Lösung oder eine VBA-Lösung (ArcGIS 9)? strip (), rstrip () und lstrip () behandeln nur Zeichen an den Enden. Wenn es sich in der Mitte einer Zeichenfolge befindet, versuchen Sie es mit .replace ("\ n", "")
Dan
Ja, ich benötige eine Python-Lösung innerhalb des Feldrechners. Die Rückgabe erfolgt innerhalb des Strings nicht am Ende. Ich habe versucht, .replace ("\ n", "") zu ersetzen, es ist jedoch ein allgemeiner 000539-Fehler aufgetreten.
Artwork21
Was ist der spezifische Python-Fehler, der mit dieser Nummer angegeben wird?
Dan
Gepostete Fehlermeldung in meiner Frage.
Artwork21
2

Ich denke, dass dies als vorlogischer Skriptcode im Feldrechner funktionieren sollte - aber leider scheint es nicht so zu sein. Ich habe es trotzdem gepostet, falls es Ihnen einen alternativen Ansatz bietet, den Sie optimieren können, um mit der Arbeit zu beginnen.

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

Versuchen Sie, Ihre !field!Deklaration in den Ausdruck mit Anführungszeichen und einem unformatierten Zeichenfolgeninitialisierer zu setzen , z r"!field!".

Versuchen Sie es str(!field!)auch.

blah238
quelle
Es funktioniert nicht Ich habe auch versucht, MYFIELD.replace(r"\n",""), but it doesn't see that I've escaped the newline character, it just fails with a EOL` Fehler.
Cindy Jayakumar
Sie haben Recht, siehe meine andere Antwort. Verlassen dieses für die Nachwelt.
blah238