【ArcGIS Pro二次开发】(34):从字符串中提取中文、英文、数字与特殊符号

news2024/10/6 12:35:32

这是一个基于字段计算的工具。

有时候我们会遇到一些混杂着各种中文、英文、数字、特殊符号的文字,这个工具的目的是从这些复杂文字中提取出想要的特定文字。

比如说从CAD测绘图中可以读取到类似【混3】、【砖2】的文字,如果想要从中提取出层数或结构,就可以用这个工具实现。


一、要实现的功能

如上图所示,点击【提取特定文字】工具,选择地图内的要素图层或独立表,再选择要处理的包含复杂文字的字段和要输出结果的字段,再选择提取模式,点击执行即可。

执行结果如下:

有点像字段计算器计算的结果,实际上用字段计算器也能实现上面的效果,有兴趣的可以看一下这一篇文章:Arcgis小技巧【10】——字段计算器的简单用法和示例


二、实现流程

首先要从当前选择的图层或独立表中获取【Table】,作为后续字段计算的载体。

因为选择的可能是要素图层或者独立表,写了一个通用方法,考虑的比以前要多一些。

        // 从图层获取Table
        public static Table GetTableFromLayer(string fcPath)
        {
            // 判断是否选择了图层
            if (fcPath == "")
            {
                MessageBox.Show("请选择一个要素图层或表");
                return null;
            }
            // 根据图层名找到当前图层
            var map = MapView.Active.Map;
            var init_featurelayer = map.FindLayers(fcPath);
            var init_table = map.FindStandaloneTables(fcPath);

            // 判断当前选择的是要素图层还是独立表
            if (init_featurelayer.Count == 0)
            {
                // 是独立表的情况
                StandaloneTable init_layer = map.FindStandaloneTables(fcPath)[0];
                return init_layer.GetTable();
            }
            if (init_table.Count == 0)
            {
                // 是要素图层的情况
                FeatureLayer init_layer = map.FindLayers(fcPath)[0] as FeatureLayer;
                return init_layer.GetTable();
            }
            return null;
        }

获取到【Table】之后,就可以通过游标进行字段计算了:

                await QueuedTask.Run(() =>
                {
                    // 获取所选图层的所有字段
                    var tb = ToolManager.GetTableFromLayer(layer_path);
                    // 字段计算
                    using (ArcGIS.Core.Data.Table table = tb)
                    {
                        using (RowCursor rowCursor = table.Search(null, false))
                        {
                            TableDefinition tableDefinition = table.GetDefinition();
                            while (rowCursor.MoveNext())
                            {
                                using (Row row = rowCursor.Current)
                                {
                                    // 获取输入字段的值
                                    var value_in = row[field_in].ToString();
                                    // 提取特定文字
                                    row[field_out] = ToolManager.GetWord(value_in, model);
                                    // 保存
                                    row.Store();
                                }
                            }
                        }
                    }
                });

这里的ToolManager.GetWord(value_in, model)方法就是最核心的代码了,主要是通过正则表达式来实现:

        // 提取特定文字【model包括:中文、英文、数字、特殊符号】
        public static string GetWord(string txt_in, string model = "中文")
        {
            string chinesePattern = "[\u4e00-\u9fa5]"; // 匹配中文字符的正则表达式
            string englishPattern = "[a-zA-Z]"; // 匹配英文字符的正则表达式
            string digitPattern = @"\d"; // 匹配数字的正则表达式
            string specialCharPattern = @"[^a-zA-Z0-9\u4e00-\u9fa5\s]"; // 匹配特殊符号的正则表达式

            string txt = "";

            if (model == "中文")
            {
                Regex chineseRegex = new Regex(chinesePattern);
                txt = ExtractMatches(txt_in, chineseRegex);
            }
            else if (model == "英文")
            {
                Regex englishRegex = new Regex(englishPattern);
                txt = ExtractMatches(txt_in, englishRegex);
            }
            else if (model == "数字")
            {
                Regex digitRegex = new Regex(digitPattern);
                txt = ExtractMatches(txt_in, digitRegex);
            }
            else if (model == "特殊符号")
            {
                Regex specialCharRegex = new Regex(specialCharPattern);
                txt = ExtractMatches(txt_in, specialCharRegex);
            }
            return txt;
        }
        // 正则匹配
        public static string ExtractMatches(string input, Regex regex)
        {
            string result = "";
            MatchCollection matches = regex.Matches(input);

            foreach (Match match in matches)
            {
                result += match.Value;
            }
            return result;
        }

核心代码并不长,正则表达式之前在python中用过,这次在c#中实现,基本差不多,还是很好用的。


三、工程文件分享

 最后,放上工程文件的链接:

GetWordicon-default.png?t=N4P3https://pan.baidu.com/s/1IJ6qDrMKcZqWCsPceAy5bA?pwd=y1vyPS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/617968.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python宏变量——简介

Python宏变量——简介 Python是一种高级编程语言,具有易学易用、简洁清晰等优点。但我们在编写代码的时候,有时需要用到常量或者宏定义,这就需要用到宏变量。在Python中,宏变量是一种常见的编程方法,本文将详细介绍Py…

chatgpt赋能python:Python安装后怎么使用?

Python安装后怎么使用? Python是一种高级编程语言,被广泛用于Web开发、数据分析、人工智能和自动化等领域。下面我们将介绍安装Python后如何使用它。 步骤1 - 安装Python 首先,从官方网站下载并安装Python。在安装过程中,您可以…

chatgpt赋能python:Python中的构造方法是什么?

Python中的构造方法是什么? 当你开始学习 Python 编程时,你可能经常听到 “构造方法” 这个词。那么,什么是构造方法?为什么它在 Python 中很重要?本文将为您揭示构造方法的概念以及它们在 Python 中的作用。 什么是…

案例36:基于Springboot药店管理系统开题报告设计

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

chatgpt赋能python:Python程序员必知的Geany配置技巧

Python程序员必知的Geany配置技巧 如果你是一名Python程序员,并且正在寻找一个简单易用的代码编辑器,那么Geany是一个非常不错的选择。Geany是一款轻量级的集成开发环境(IDE),除了Python,还支持许多其他编…

chatgpt赋能python:Python安装完后如何打开

Python安装完后如何打开 Python是一种高级的、解释性、交互式的编程语言,已经成为了广泛的编程应用领域中不可或缺的一部分,如网络编程、数据科学和人工智能等。Python的安装对于学习、开发和应用Python技术非常重要,但安装了Python后如何打…

案例38:基于Springboot电影评论网站开题报告设计

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

chatgpt赋能python:Python中的Gevent:安装和使用

Python 中的 Gevent: 安装和使用 Gevent 是 Python 生态系统中的一个流行的高性能网络库,它是基于 libev 的 Python 网络库,提供了非阻塞IO、协程和并发编程等方面的特性。Gevent 使得开发高性能的网络应用程序变得简单而易行。本文将介绍如何在 Python…

【Leetcode】78 子集 | 保存遍历路径上的所有节点 // 46 排列 | 使用辅助数组记录元素是否使用

78 子集 与组合问题相比,需要保存路上经过的所有节点。 写法1 分为选择第 i i i个元素和不选择第 i i i个元素两种情况递归。 每push进一个元素,代表进入了一个新的节点,就保存当前的路径。 import java.util.ArrayList; import java.uti…

JUC基础-0606

9.ReentrantReadWriteLock读写锁 9.1 锁的基本概念 悲观锁:不支持并发,效率低,但是可以解决所有并发安全问题 乐观锁:支持并发读,维护一个版本号,写的时候比较版本号进行控制,先提交的版本号…

chatgpt赋能python:Python配置指南:提高SEO效果的关键

Python配置指南:提高SEO效果的关键 Python作为一种高效、易学易用的编程语言,在数据科学、机器学习、网络编程等领域得到了广泛应用。作为一个网站管理员,如何让Python支持的应用程序尽可能地符合搜索引擎优化(SEO)的…

UI自动化测试之Jenkins配置

团队下半年的目标之一是实现自动化测试,这里要吐槽一下,之前开发的测试平台了,最初的目的是用来做接口自动化测试和性能测试,但由于各种原因,接口自动化测试那部分功能整个废弃掉了,其中和易用性有很大关系…

chatgpt赋能python:Python安装教程:一步步实现Python开发环境搭建

Python安装教程:一步步实现Python开发环境搭建 Python是一种高效、易读、易维护的编程语言。在人工智能、数据科学、Web开发等领域都有广泛的应用。如果你是一名初学者或Python开发者,本文将为你提供Python安装教程。 第一步:下载Python安装…

深入浅出之Docker Compose详解

目录 1.Docker Compose概述 1.1 Docker Compose 定义 1.2 Docker Compose产生背景 1.3 Docker Compose 核心概念 1.4 Docker Compose 使用步骤 1.5 Docker Compose 常用命令 2. Docker Compose 实战 2.1 Docker Compose下载和卸载 2.2 Docker Compose 项目概述 2.3 Do…

chatgpt赋能python:Python定义局部变量的方法

Python定义局部变量的方法 Python是一种非常流行的编程语言,它被广泛用于各种应用程序开发、数据科学和机器学习任务。在Python中,如何定义局部变量是一个非常基本的概念。本文将重点介绍Python中定义局部变量的方法。 什么是局部变量? 在…

前端小项目基础版本----时刻监听audio音频的声音高低 可视化显示+源码

目录 时刻监听audio音频的声音高低第一代实现:基本第二代实现:完善 时刻监听audio音频的声音高低 前端小项目基础----时刻监听audio音频的声音高低 可视化显示 第一代实现:基本 实现的效果 根据 音频的某时刻高低 调整生成不同的柱状 以下就是 源码 直接复制粘贴 找个音频放…

AIGC技术研究与应用 ---- 下一代人工智能:新范式!新生产力!(2.3-大模型发展历程 之 图像、视频生成与视觉大模型)

文章大纲 GAN 模型与强化学习强化学习生成式对抗网络 ( Generative Adversarial Nets, GAN)VAE扩散模型扩散逆扩散参考文献与学习路径GPT 系列模型解析前序文章模型进化券商研报陆奇演讲强化学习生成模型多模态GAN 模型与强化学习 强化学习 Reinforcement learning (RL) is …

【SpinalHDL快速入门】4.5、复合类型之Bundle

文章目录 1.1、描述1.2、声明1.2.1、条件信号(Conditional signals) 1.3、运算符1.3.1、比较(Comparison)1.3.2、类型转换(Type cast)1.3.3、将比特转换回 Bundle 1.4、IO元素方向1.4.1、in/out1.4.2、mast…

《.NET 下最快比较两个文件内容是否相同》之我的看法验证

我对文件对比这一块还是比较感兴趣的,也想知道哪种方式性价比最高,效率最好,所以,根据这篇文章,我自己也自测一下,顺便留出自己对比的结果,供大佬们参考一二。 大致对比方案 我这边根据文章里…

循环队列(Ring Buffer)

背景: 最近在复习数据结构和算法,顺带刷刷题,虽然很长时间不刷题了但还是原来熟悉的味道,每一次重学都是加深了上一次的理解。本次我们看一下 循环队列(Ring Buffer),C语言实现。 循环队列:首先 它是一个队…