Удалить символ возврата / перевода строки (\ n) из поля, используя Python и Field Calculator?

14

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

!myField!.rstrip()

ИЛИ

!myField!.rstrip('\n')

ИЛИ

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

ИЛИ

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

Ошибка 000539 приведена для этой опции:

Описание Неверный расчет, используемый инструментом «Вычислить поле» или «Вычислить значение». В этом сообщении об ошибке будет указана конкретная ошибка Python.

Решение Этот код ошибки охватывает несколько ошибок Python:

Пример ошибки 1: exceptions.TypeError: невозможно объединить объекты 'str' и 'int'. Выше - ошибка, специфичная для Python. Расчет пытается добавить или объединить строку и число.

Пример ошибки 2: неверная форма поля @ расстояние. Выше приведена ошибка при использовании объекта геометрии. Метод расстояния не является допустимым методом объекта геометрии.

По конкретным вопросам Python обратитесь к внешней справке Python для получения дополнительной информации или к справке Calculate Field или Calculate Value для получения дополнительной информации об этих инструментах.

ИЛИ

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

Любые идеи о том, как удалить возвращаемые символы с помощью полевого калькулятора?

artwork21
источник
Вы уверены, что это символ новой строки ("\ n")? Может ли это быть возврат каретки ("\ r") вместо этого? Кроме того, все значения во всех строках альфа, или, возможно, его сбой на числовое значение в одном из полей? Возможно str (! MyField!). Rstrip ('\ n')
RyanKDalton
Пожалуйста, опубликуйте полную трассировку Python с сообщением об ошибке и номером строки, а не с ошибкой ArcGIS, которую вы получаете (что является общим и бесполезным).
blah238
Это начинает выглядеть как-то в самой ArcGIS, потому что все приведенные ответы на Python верны.
Синди Джаякумар
Вы получаете SyntaxError: EOL while scanning string literalошибку?
blah238
Я не уверен, как калькулятор обрабатывает импорт модулей, но вы также можете попробовать: import re и использовать re.sub.
Томек

Ответы:

9

Я думаю, что это просто ошибка / ограничение синтаксического анализатора Python с помощью калькулятора полей / инструмента вычисления поля. Если в текстовом поле SyntaxError: EOL while scanning string literalвстречается символ новой строки, то происходит, что бы вы ни пытались.

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

ID, Текст
1, «это мультилинейный 
пример"

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

Этот вопрос также обсуждается на форумах ESRI с такими же выводами:

Единственный соответствующий NIM, который я мог найти, был таким:

  • NIM085499 - Расчеты CalculateField с использованием символов, не относящихся к ASCII, не выполняются на движке Linux с: «ОШИБКА 000539: SyntaxError: EOL при сканировании строкового литерала (, строка 1)».
blah238
источник
4

Есть два возможных решения, которые я считаю надежными. По какой-то причине CartoPac позволяет людям помещать Return в поле REMARKS, где я работаю. Чтобы избавиться от них, наилучшим решением, которое я нашел, является использование Калькулятора поля.

Измените свой парсер на Python. Поместите следующее в Pre-Logic Script Code:

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)  

Замените «Assets \ Welds» на соответствующее имя fc и замените row.REMARKS на row. (Введите имя поля здесь)

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

import arcpy  
import string
Захари Ордо - GISP
источник
Я даю вам шанс, ваше заявление после вашего заявления должно быть с отступом.
artwork21
Хороший улов ... он не копировался должным образом, когда я копировал из рабочего сценария командного окна Python.
Захари Ордо - GISP
4

Чтобы обойти это, поскольку моя таблица классов объектов возникла в Excel, нужно было использовать следующую команду Excel:

= ЧИСТЫЙ

метод для удаления всех символов возврата или новой строки. Затем вы можете присоединиться или импортировать таблицу в вашу базу данных ГИС.

artwork21
источник
3

Я использовал оператор SQL, чтобы сначала выбрать символы новой строки. В Select By Attributesдиалоговом окне:

"MY_FIELD" LIKE '%
 %'

Вы должны нажать Enterпосле первого%.

Синди Джаякумар
источник
2
Я просто понял, что, хотя это и показывало мне, где находятся символы новой строки, я также не мог приступить MY_FIELD.strip()к работе, но, поскольку у меня было только 5 записей, я вручную их редактировал.
Синди Джаякумар
Возможно, вы могли бы выбрать их следующим образом, а затем использовать полевой калькулятор для пересчета значений с помощью выражения Python !MY_FIELD![:-1]- срез строки должен удалять символ новой строки (при условии, что после новой строки ничего не приходит, что, по-видимому, имеет место для OP) ,
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()
Дэн
источник
что не работает в полевом калькуляторе.
artwork21
Вам нужно решение Python или VBA (ArcGIS 9)? strip (), rstrip () и lstrip () имеют дело только с символами на концах. Если он находится в середине строки, попробуйте .replace ("\ n", "")
Дан
Да, мне нужно решение Python в полевом калькуляторе. Возврат находится внутри строки, а не в конце. Я попытался .replace ("\ n", ""), однако я получил общую ошибку 000539.
artwork21
Какова конкретная ошибка Python с этим номером?
Дан
Выложено сообщение об ошибке в моем вопросе.
artwork21
2

Я думаю, что это должно работать как код предварительного скрипта в калькуляторе полей, но, к сожалению, это не так. В любом случае я разместил его на тот случай, если он даст вам альтернативный подход, который вы можете настроить, чтобы начать работать.

def fix(teststring):
    parts = teststring.splitlines()
    newtest = ""
    for part in parts:
        newtest+=part
    return newtest
PolyGeo
источник
2

Попробуйте обернуть ваше !field!объявление в выражении кавычками и инициализатором необработанной строки , например r"!field!".

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

blah238
источник
Не работает Я тоже попробовал MYFIELD.replace(r"\n",""), but it doesn't see that I've escaped the newline character, it just fails with a EOL` ошибку.
Синди Джаякумар
Вы правы, смотрите мой другой ответ. Оставив этот для потомков.
blah238