操作方法

操作方法:对存储在文本字段中的数值进行排序

Last Published: April 4, 2025

描述

在 ArcGIS Pro 中,我们可以根据字段对数据进行排序。 可以选择按升序或降序对每个字段进行排序,我们可以组合字段。 有关对表中的记录进行排序的详细信息,请参阅此处:对表中的记录进行排序

当字段很简单时,例如数值类型字段中的数值或文本字段中的字母,那么表格排序就很简单了。 长整型字段类型中的数字可以轻松按升序排序,“文本”字段中的单词可以按字母顺序排序。

数值排序

升序的数值字段

按字母顺序排序

按字母顺序排序的文本字段

但是,对存储在文本字段中的数值进行排序会产生意外结果。 我们得到的不是 1,然后是 2 和 3,依此类推,而是得到 1,后跟 10,然后是 100,如下图所示。

000031875_NumbersText.jpg

解决方案或解决方法

为了更好地理解这种行为,我们首先需要了解 Unicode 和 ASCII 值以及 Python 排序。 请参阅 ArcGIS Pro 参考: Unicode 快速浏览

Unicode 是“一种计算机使用的字符编码系统,用于存储和交换文本”。每个代码对应一个唯一的字符。 数字 0 到 9 的 Unicode 值是 U+0030 到 U+0039,而 ASCII 码是 48 到 57。 需要注意的是,数字 10 没有 Unicode 或 ASCII 值,我们只是将 1 和 0 的代码组合在一起。  
当按升序对数据进行排序时,ArcGIS Pro 会在选择的排序字段中为每行从左到右读取值。 比较第一个字符的 Unicode 值并按升序列出。 对于所有行中的所有字符,此过程将继续进行。 编码值都按升序排序,将字段排序为结果。

当我们考虑排序示例时,数字 1 (U+0031) 排在第一位,然后是数字 10 (U+0031 U+0030)、100 (U+0031 U+0030 U+0030) 等等。 这种排序类型的另一个示例在字典中,所有以 A 开头的单词都列在以 B 开头的单词之前,因此 aardvark 列在 abate 之前。 这样,当我们按升序对值进行排序时,数值从 1 到 10009、1001 到 10019、1002 到 10029 依此类推。 一个明显的问题是 1002 出现在 10019 之后,因为算法首先查看字符 100*,然后将 1 与 2 进行比较,确定 1 出现在 2 之前,然后将所有字符串与 1001* 进行比较,将 1002 放在序列中的后面。 这解释了为什么 10 在 2 之前 (U+0032),因为排序已将 '1*' 排序为 2 之前。

理想情况下,如果我们想对具有数值分量的字段进行排序,将使用数值字段类型,例如长整型,其中数值被视为整数而不是 Unicode 值。 如果我们确实想根据包含字母数字字符混合的文本字段对数据进行排序,最好的选择是在比较中包含字符串长度。 这意味着首先对所有具有单个字符的行进行排序,然后对所有双字符进行排序,依此类推。 这样,数字 2 就会出现在 10 之前。 要在 ArcGIS Pro 中执行此作,我们需要在表中包含字符串长度字段来计算数值分量的长度。 理想情况下,我们会有一个定义字符,可以用来分隔值,例如正斜杠 (/)。
使用计算字段窗口中的代码块,我们可以使用如下公式:

import re
def calculate_sort_value(s): 
       if '/' in s: 
                     result = s.split("/", 1)[1] 
                     return len(result) 
 
       else: 
               return None

然后,我们可以应用这个新的长度字段作为我们的排序。 如果我们的文本字段更复杂,例如具有不同字符集的建筑规范,即有些使用连字符,而另一些使用斜杠标记,我们可以创建多个长度字段,并使用自定义排序功能将它们组合为主要和辅助排序字段。 首先,我们所有的行都将按长度 A 排序,然后是长度 B。

文章 ID: 000031875

接收通知并查找新问题或常见问题的解决方案

从我们全新的 AI 聊天机器人中获得简明答案和视频解决方案。

下载 Esri 支持应用程序

相关信息

发现关于本主题的更多内容

获取来自 ArcGIS 专家的帮助

联系技术支持部门

下载 Esri 支持应用程序

转至下载选项