使用Python和Field Calculator从Field中删除返回/换行符(\ n)?


14

我有一个地理数据库表,其中包含我要删除返回字符(换行)的字段。我发现了这篇文章(如何在Python中删除(删除)换行符?),但是它在字段计算器中不起作用。以下是我尝试的代码段: 注意return字符不在string的末尾

!myField!.rstrip()

要么

!myField!.rstrip('\n')

要么

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

要么

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

000539错误给出此选项:

说明“计算字段”或“计算值”工具使用的计算无效。提供的此错误消息将列出特定的Python错误。

解决方案此错误代码涵盖了许多Python错误:

错误示例1:exceptions.TypeError:无法连接'str'和'int'对象。上面是特定于Python的错误。计算正在尝试添加或连接字符串和数字。

错误示例2:无效的shape_distance字段上面是使用几何对象的错误。距离方法不是几何对象的有效方法。

对于特定的Python问题,请查阅外部Python帮助以获取更多信息,或查阅Calculate Field或Calculate Value帮助以获取关于这些工具的更多信息。

要么

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

关于如何使用字段计算器删除返回字符的任何想法?


您确定它是换行符(“ \ n”)吗?可能是回车符(“ \ r”)吗?另外,所有行中的所有值是否都是alpha值,或者它在某个字段中的数字值上失败?可能str(!myField!)。rstrip('\ n')
RyanKDalton 2012年

请发布完整的Python追溯,包括错误消息和行号,而不是您遇到的ArcGIS错误(这是通用且无济于事的)。
blah238

它开始看起来像ArcGIS本身一样,因为给出的各种Python答案都是正确的。
Cindy Jayakumar 2012年

您遇到SyntaxError: EOL while scanning string literal错误了吗?
blah238

我不确定计算器如何处理导入模块,但您也可以尝试:import re and use re.sub。
Tomek

Answers:


9

我认为这只是使用字段计算器/计算字段工具的Python解析器的错误/局限性。如果在文本字段中遇到换行符,SyntaxError: EOL while scanning string literal无论您尝试什么,都会发生a 。

我可以通过将以下CSV文件导入文件地理数据库中,添加一个字段并简单地尝试Text使用带有Python解析器和表达式的Field Calculator 将字段复制到新字段来在10.1 SP1上重现该问题!Text!

ID,文字
1,“这是多行 
例”

尝试切换到VB解析器,或者使用UpdateCursor和而不使用字段计算器。

在ESRI论坛上也讨论了此问题,并得出了相同的结论:

我可以找到的唯一相关的NIM是:

  • NIM085499-在Linux引擎上,使用非ASCII字符的CalculateField计算失败,错误消息为:“ ERROR 000539:SyntaxError:扫描字符串(行1)的EOL”。

4

我发现有两种可能的解决方案是可靠的。由于某些原因,CartoPac允许人们在我工作的“备注”字段中输入“退货”。为了摆脱这些问题,我发现最有效的解决方案是使用字段计算器。

将解析器更改为Python。将以下内容放入逻辑前脚本代码中:

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

将以下内容放在下一个文本框中(此文本框正在处理一个称为REMARKS的字段):

carriageReturnRemoval( !REMARKS! )

在此处输入图片说明

当您的回车被取走时,它将在每行之间添加一个空格,-和一个空格。您可以根据需要将“-”修改为其他字符或一组字符。但是根据我的施工人员输入数据的方式,我发现这对我来说最有效。如果存在可识别的字符模式来分解每个回车符,则查找/替换操作会更容易,它们会在字段中使用该字符模式来表示新属性(即使通常可以将它们放在适当的字段中也可以使用该属性)并让我免除了头疼的麻烦。

如果您希望在ArcGIS中使用Python控制台,则可以修改以上内容以使其正常工作。但是,我也在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

我试一下,如果您的语句需要缩进,那么您的语句就可以了。
艺术品

很好...从正常的Python命令窗口脚本复制时,复制没有正确复制。
Zachary Ordo-GISP

4

自从我的要素类表起源于excel以来,解决此问题的方法是使用以下excel命令:

= 清洁

删除所有返回或换行符的方法。然后,您可以将表联接或导入到GIS数据库中。


3

我已使用SQL语句首先选择新的换行符。在Select By Attributes对话框窗口中:

"MY_FIELD" LIKE '%
 %'

您必须Enter在第一个%之后按。


2
我只是意识到,虽然这向我显示了换行符的位置,但我也无法MY_FIELD.strip()使用,但是因为我只有5条记录,所以我手动对其进行了编辑。
Cindy Jayakumar

您可能会这样选择它们,然后使用字段计算器使用Python表达式重新计算值!MY_FIELD![:-1]-字符串切片应删除换行符(假设换行符后面没有任何字符,这在OP中似乎是这种情况) 。
nmpeterson 2014年

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错误是什么?
2012年

在我的问题中发布了错误消息。
Artwork21年

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`错误。
Cindy Jayakumar 2012年

您是正确的,请参阅我的其他答案。将此留给后代。
blah238
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.