Czy usunąć znak powrotu / nowej linii (\ n) z pola za pomocą Pythona i kalkulatora pola?

14

Mam tabelę geobazy z polem, które próbuję usunąć znaki powrotu (nowa linia). Znalazłem ten post ( Jak mogę usunąć (chomp) nową linię w Pythonie? ), Jak to zrobić, jednak nie działa w kalkulatorze polowym. Oto fragmenty kodu, które próbowałem: Uwaga Zwracany znak nie znajduje się na końcu łańcucha .

!myField!.rstrip()

LUB

!myField!.rstrip('\n')

LUB

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

LUB

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

000539 błąd podany dla tej opcji:

Opis Obliczenia zastosowane przez narzędzie Oblicz pole lub Oblicz wartość są nieprawidłowe. Ten komunikat o błędzie wyświetli listę konkretnego błędu w języku Python.

Rozwiązanie Ten kod błędu obejmuje szereg błędów w języku Python:

Przykładowy błąd 1: wyjątki. Błąd: nie można połączyć obiektów „str” i „int”. Powyżej jest błąd specyficzny dla Pythona. Obliczenia próbują dodać lub połączyć łańcuch i liczbę.

Przykładowy błąd 2: Niepoprawny kształt pola @ odległość Powyższy błąd dotyczy użycia obiektu geometrii. Metoda odległości nie jest prawidłową metodą obiektu geometrycznego.

Aby uzyskać szczegółowe informacje na temat określonych problemów w języku Python, zapoznaj się z zewnętrzną pomocą języka Python, aby uzyskać więcej informacji, lub skorzystaj z pomocy Oblicz pole lub Oblicz wartość, aby uzyskać więcej informacji na temat tych narzędzi.

LUB

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

Wszelkie pomysły na usunięcie znaków powrotu za pomocą kalkulatora pola?

grafika 21
źródło
Czy na pewno jest to znak nowej linii („\ n”)? Czy może to być zamiast tego powrót karetki („\ r”)? Ponadto, czy wszystkie wartości we wszystkich wierszach mają wartość alfa, czy może zawodzi na wartości liczbowej w jednym z pól? Prawdopodobnie str (! MyField!). Rstrip ('\ n')
RyanKDalton
Proszę zamieścić pełną informację zwrotną w języku Python z komunikatem o błędzie i numerem wiersza, a nie występującym błędem ArcGIS (który jest ogólny i nieprzydatny).
blah238,
Zaczyna wyglądać jak coś w samym ArcGIS, ponieważ wszystkie podane odpowiedzi w Pythonie są poprawne.
Cindy Jayakumar,
Czy pojawia się SyntaxError: EOL while scanning string literalbłąd?
blah238,
Nie jestem pewien, w jaki sposób kalkulator obsługuje importowanie modułów, ale możesz także spróbować: zaimportuj ponownie i użyj re.sub.
Tomek

Odpowiedzi:

9

Myślę, że to tylko błąd / ograniczenie parsera Pythona za pomocą narzędzia kalkulatora pola / narzędzia Oblicz pole. Jeśli w polu tekstowym pojawi się nowa linia, SyntaxError: EOL while scanning string literalwystępuje niezależnie od tego, co spróbujesz.

Mogę odtworzyć problem w wersji 10.1 SP1, importując następujący plik CSV do geobazy danych pliku, dodając pole i po prostu próbując skopiować Textpole do nowego pola za pomocą Kalkulatora pola z analizatorem składni Pythona i wyrażeniem !Text!.

ID, tekst
1, „jest to multilinia 
przykład"

Spróbuj przełączyć się na parser VB lub UpdateCursorcałkowicie uniknąć kalkulatora pola.

Zagadnienie to jest również omawiane na forach ESRI, z tymi samymi wnioskami:

Jedyny odpowiedni NIM, jaki mogłem znaleźć, to:

  • NIM085499 - Obliczenia CalculateField przy użyciu znaków spoza ASCII kończą się niepowodzeniem w silniku Linux z: „BŁĄD 000539: Błąd składni: EOL podczas skanowania literału ciągu (, wiersz 1)”.
blah238
źródło
4

Istnieją dwa możliwe rozwiązania, które uważam za niezawodne. Z jakiegoś powodu CartoPac pozwala ludziom na zwrot w polu UWAGI, w której pracuję. Aby się ich pozbyć, rozwiązaniem, które uważam za najlepsze, jest użycie kalkulatora pola.

Zmień Parser na Python. Wstaw kod skryptu przedlogicznego:

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

W następnym polu tekstowym umieść następujący tekst (ten działa na polu o nazwie UWAGI):

carriageReturnRemoval( !REMARKS! )

wprowadź opis zdjęcia tutaj

Po usunięciu zwrotów karetki doda spację, - i spację między każdą linią. Jeśli chcesz, możesz zmienić „-” na inny znak lub zestaw znaków. Uważam jednak, że działa to najlepiej dla mnie w zależności od sposobu, w jaki ekipy budowlane wprowadzają dane. Łatwiej jest wykonywać operacje Znajdź / zamień, jeśli istnieją rozpoznawalne wzorce znaków dzielące każdy powrót karetki, których używają w polu do oznaczenia nowego atrybutu (chociaż często jest to atrybut, który mogliby po prostu umieścić w odpowiednim polu i przede wszystkim uratował mnie ból głowy).

Jeśli wolisz używać konsoli Python w ArcGIS, możesz zmodyfikować powyższe, aby działało. Jednak spróbowałem tego również z pewnym powodzeniem w konsoli 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)  

Zamień „Assets \ Welds” na odpowiednią nazwę fc i zamień row.REMARKS na row. (Tutaj wstaw nazwę pola)

Przed próbą wykonania powyższego przykładu kodu może być konieczne uruchomienie poniższych linii importu:

import arcpy  
import string
Zachary Ordo - GISP
źródło
Daję mu szansę, twoje oświadczenie po twoim, jeśli oświadczenie wymaga wcięcia.
grafika 21
Dobry haczyk ... nie skopiował się poprawnie, gdy skopiowałem z działającego skryptu okna poleceń Pythona.
Zachary Ordo - GISP,
4

Obejściem tego było odkąd moja tabela klas obiektów powstała w programie Excel polegała na użyciu następującego polecenia programu Excel:

= CZYSTE

metoda usunięcia wszystkich znaków powrotu lub nowego wiersza. Następnie możesz dołączyć lub zaimportować tabelę do swojej bazy danych GIS.

grafika 21
źródło
3

Użyłem instrukcji SQL, aby najpierw wybrać nowe znaki wiersza. W Select By Attributesoknie dialogowym:

"MY_FIELD" LIKE '%
 %'

Musisz nacisnąć Enterpo pierwszym%.

Cindy Jayakumar
źródło
2
Właśnie zdałem sobie sprawę, że chociaż to pokazało mi, gdzie są nowe znaki linii, nie mogłem również zabrać się MY_FIELD.strip()do pracy, ale ponieważ miałem tylko 5 rekordów, ręcznie je edytowałem.
Cindy Jayakumar,
Prawdopodobnie możesz je wybrać w ten sposób, a następnie użyć kalkulatora pola, aby ponownie obliczyć wartości za pomocą wyrażenia w języku Python !MY_FIELD![:-1]- odcinek łańcucha powinien usunąć znak nowej linii (zakładając, że po nowej linii nic się nie dzieje, co wydaje się być w przypadku OP) .
nmpeterson
3

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

Kalkulator pola jest nieco zagmatwany, jeśli chodzi o sekwencje specjalne, takie jak \ni \t. Wystarczy użyć nieprzetworzonych kodów znaków.

Jason Scheirer
źródło
Nadal się SyntaxError: EOL while scanning string literalz tym zgadzam. Parser VB działa dobrze.
blah238,
W wyrażeniu, a nie w bloku kodu? I tylko w wersji 10.0?
Jason Scheirer,
W wyrażeniu na 10.1 SP1.
blah238,
2
myString = "My text\n"

print myString.strip()
Dan
źródło
które nie działały w kalkulatorze polowym.
grafika
Czy potrzebujesz rozwiązania w języku Python lub VBA (ArcGIS 9)? strip (), rstrip () i lstrip () zajmują się tylko znakami na końcach. Jeśli jest w środku łańcucha, spróbuj .replace ("\ n", "")
Dan
Tak, potrzebuję rozwiązania python w kalkulatorze polowym. Zwrot znajduje się w ciągu nie na końcu. Próbowałem .replace („\ n”, „”), jednak wystąpił ogólny błąd 000539.
grafika
Jaki konkretny błąd Pythona jest podany dla tego numeru?
Dan
Wysłano komunikat o błędzie w moim pytaniu.
grafika
2

Myślę, że powinno to działać jako kod skryptu przedlogicznego w kalkulatorze polowym - ale niestety nie wydaje się. Mimo to opublikowałem go na wypadek, gdybyś dostał alternatywne podejście do pracy.

def fix(teststring):
    parts = teststring.splitlines()
    newtest = ""
    for part in parts:
        newtest+=part
    return newtest
PolyGeo
źródło
2

Spróbuj owinąć !field!deklarację w wyrażeniu cudzysłowami i inicjatorem nieprzetworzonego ciągu , np r"!field!".

Spróbuj str(!field!)również.

blah238
źródło
To nie działa Próbowałem także MYFIELD.replace(r"\n",""), but it doesn't see that I've escaped the newline character, it just fails with a błąd EOL`.
Cindy Jayakumar,
Masz rację, zobacz moją drugą odpowiedź. Pozostawienie tego dla potomności.
blah238,