Видалення символу return / newline (\ n) з поля за допомогою Python і Field Calculator?


14

У мене є таблиця бази даних з полем, з якого я намагаюся видалити символи, що повертаються (новий рядок). Я знайшов цю публікацію ( як я можу видалити (chomp) новий рядок у Python? ), Як це зробити, однак він не працює в польовому калькуляторі. Ось фрагменти коду, які я спробував: Примітка повернення символу не в кінці рядка .

!myField!.rstrip()

АБО

!myField!.rstrip('\n')

АБО

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

АБО

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

Для цієї опції вказана помилка 000539:

Опис Розрахунок, використаний інструментом "Обчислити" або "Обчислити значення", недійсний. У цьому повідомленні про помилку буде вказано конкретну помилку Python.

Рішення Цей код помилки охоплює ряд помилок Python:

Приклад помилки 1: виключення.TypeError: не може об'єднати об’єкти 'str' та 'int'. Викладене вище - специфічна помилка Python. Обчислення намагається додати або об'єднати рядок і число.

Приклад помилки 2: Неправильна форма поля @ відстань Наведене вище - помилка з використанням об’єкта геометрії. Метод відстані не є дійсним методом об’єкта геометрії.

Для отримання конкретних проблем з Python, для отримання додаткової інформації зверніться до зовнішньої довідки Python, або для отримання додаткової інформації про ці інструменти зверніться до поля «Обчислити» або «Розрахувати значення».

АБО

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

Будь-які ідеї, як видалити зворотні символи за допомогою калькулятора поля?


Ви впевнені, що це символ нового рядка ("\ n")? Чи може бути замість цього повернення вагона ("\ r")? Також, чи є всі значення альфа-рядків у всіх рядках, чи, можливо, воно не відповідає чисельному значенню в одному з полів? Можливо str (! MyField!). Rstrip ('\ n')
RyanKDalton

Будь ласка, опублікуйте повний зворотний зворот Python із повідомленням про помилку та номером рядка, а не помилкою ArcGIS, яку ви отримуєте (що є загальним і не корисним).
blah238

Це починає виглядати як щось у самому ArcGIS, тому що різні відповіді Python - це все правильно.
Сінді Джаякумар

Ви отримуєте SyntaxError: EOL while scanning string literalпомилку?
blah238

Я не впевнений, як калькулятор обробляє модулі імпорту, але ви також можете спробувати: імпортувати повторно та використовувати re.sub.
Томек

Відповіді:


9

Я думаю, що це лише помилка / обмеження аналізатора Python за допомогою калькулятора поля / інструменту «Розрахувати поле». Якщо в текстовому полі зустрічається новий рядок, це SyntaxError: EOL while scanning string literalвідбувається незалежно від того, що ви намагаєтеся.

Я можу відтворити проблему на 10.1 SP1, імпортуючи такий файл CSV у базу даних геоданих, додавши поле та просто спробу скопіювати Textполе в нове поле, використовуючи калькулятор поля за допомогою аналізатора Python та вираз !Text!.

Ідентифікатор, Текст
1, "це багаторядковий 
приклад "

Спробуйте переключитися на аналізатор VB або використати UpdateCursorі повністю уникати калькулятора поля.

Це питання також обговорюється на форумах ESRI із тими ж висновками:

Єдиний відповідний NIM, який я міг знайти, це:

  • NIM085499 - Обчислити обчислення поля, використовуючи символи, що не належать до ASCII, помилка на двигуні Linux із: "ПОМИЛКА 000539: SyntaxError: EOL під час сканування рядкового літералу (, рядок 1)".

4

Є два можливі рішення, які я вважаю надійними. Чомусь CartoPac дозволяє людям розмістити Повернення в полі ЗАПОМОГИ, де я працюю. Щоб позбутися від них, рішення, яке, як я вважаю, працює найкраще - це використання калькулятора поля.

Змініть Parser на Python. Помістіть наступне у до-логічному коді сценарію:

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

Подайте наступне у наступному текстовому полі (це працює над полем під назвою ЗАУВАЖЕННЯ):

carriageReturnRemoval( !REMARKS! )

введіть тут опис зображення

Коли ваші коляски повернуться, буде видалено пробіл, - та пробіл між кожним рядком. Ви можете змінити "-" для іншого символу або набору символів, якщо хочете. Але я виявив, що це найкраще працює для мене на основі того, як мої будівельні бригади вводять дані. Легше виконувати операції пошуку / заміни, якщо є впізнавані шаблони символів, що розбивають кожну віддачу каретки, яку вони використовують у полі для позначення нового атрибута (навіть якщо це часто атрибут, який вони могли просто ввести у відповідне поле і врятував мені головний біль в першу чергу).

Якщо ви бажаєте використовувати консоль Python в ArcGIS, ви можете змінити вищезазначене для роботи. Однак я також спробував це з певним успіхом на консолі 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)  

Замініть "Активи \ Поля" на відповідне ім'я fc та замініть рядок. ЗАМЕЧАННЯ рядком. (Вставте назву поля тут)

Можливо, вам не знадобиться запускати рядки імпорту нижче, перш ніж спробувати приклад коду вище:

import arcpy  
import string

Я даю йому зйомку, вашу заяву після вашої, якщо заява потребує відступу.
художній твір21

Хороший улов ... він не копіювався належним чином, коли я скопіював із робочого скрипту віконця команди Python.
Захарі Ордо - GISP

4

Для вирішення цього питання, оскільки моя таблиця класів особливостей виникла в excel, полягала в тому, щоб використовувати таку команду excel:

= ОЧИСТИТИ

метод для видалення всіх символів повернення або нових рядків. Потім ви можете приєднати та імпортувати таблицю у свою базу даних GIS.


3

Я використовував оператор SQL для першого вибору нових символів рядка. У Select By Attributesдіалоговому вікні:

"MY_FIELD" LIKE '%
 %'

Ви повинні натиснути Enterпісля першого%.


2
Я просто зрозумів, що, хоча це показувало мені, де знаходяться нові символи рядків, я також не міг приступити MY_FIELD.strip()до роботи, але оскільки у мене було лише 5 записів, я вручну редагував їх.
Сінді Джаякумар

Ви, ймовірно, можете вибрати їх таким чином, а потім скористатися калькулятором поля для повторного обчислення значень із виразом Python !MY_FIELD![:-1]- фрагмент рядка повинен видалити символ нового рядка (якщо припустити, що після нового рядка нічого не відбувається, що, як здається, має місце для ОП) .
nmpeterson

3

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

Польовий калькулятор трохи заплутаний, коли йдеться про втечу послідовностей, таких як \nі \t. Просто використовуйте необроблені коди символів.


Все-таки отримую справу SyntaxError: EOL while scanning string literalз цим. VB аналізатор працює чудово.
blah238

У виразі, а не блоці коду? І лише на 10,0?
Джейсон Шейер

У виразі 10.1 SP1.
blah238

2
myString = "My text\n"

print myString.strip()

що не працювало в польовому калькуляторі.
художній твір21

Вам потрібне рішення Python або рішення VBA (ArcGIS 9)? strip (), rstrip () та lstrip () мають справу лише з символами на кінцях. Якщо він знаходиться в середині рядка, спробуйте .Прівернуть ( «\ п», «»)
Dan

Так, мені потрібне рішення python у польовому калькуляторі. Повернення знаходиться в рядку не в кінці. Я спробував .replace ("\ n", ""), однак я отримав загальну помилку 000539.
художній твір21

Яка конкретна помилка Python, дана з цим номером?
День

Опубліковано повідомлення про помилку в моєму запитанні.
художній твір21

2

Я думаю, що це має працювати як кодекс скриптів до логіки в польовому калькуляторі, але, на жаль, це не здається. Я все-таки розмістив його на випадок, якщо це дає альтернативний підхід, який можна налаштувати, щоб працювати.

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

2

Спробуйте загортати свою !field!декларацію у вираз цитатами та ініціалізатором необроблених рядків , наприклад r"!field!".

Спробуйте str(!field!)також.


Це не працює. Я також спробував MYFIELD.replace(r"\n",""), but it doesn't see that I've escaped the newline character, it just fails with a помилку EOL`.
Сінді Джаякумар

Ви правильні, дивіться мою іншу відповідь. Залишивши цю для нащадків.
blah238
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.