【ArcGIS Pro二次开发】(38):清理字段值(空格、空值)

由于一些不规范的输入,或是其它数据转换而来,要素类或者独立表的字段值经常含有空值、空格等影响数据质量的内容。

这个工具的目的就是清理、转换这些字段内容,提高数据质量。


一、要实现的功能

【ArcGIS Pro二次开发】(38):清理字段值(空格、空值)_第1张图片

如上图所示,点击【清洗字段值】按钮,在弹出的工具框中,选择要素图层或独立表,再选择一种处理模式,点击执行即可。

这里的【处理模式】有4种,【字符串:清除空格;字符串:清除空值;数字:空值转0;数字:0转空值】。功能如字面意思,很好理解。

1、字符串:清除空格

将输入图层的【所有字符串型字段】中的空格清除,不管处在哪个位置。

工具执行前后对比如下:

【ArcGIS Pro二次开发】(38):清理字段值(空格、空值)_第2张图片

2、字符串:清除空值

将输入图层的【所有字符串型字段】中的空值清除,结果不含任何文字。

工具执行前后对比如下:

【ArcGIS Pro二次开发】(38):清理字段值(空格、空值)_第3张图片

3、数字:空值转0

将输入图层的【所有数字型字段】中的空值转换为0值。

工具执行前后对比如下:

【ArcGIS Pro二次开发】(38):清理字段值(空格、空值)_第4张图片

4、数字:0转空值

将输入图层的【所有数字型字段】中的0值转换为空值。

工具执行前后对比如下:

 【ArcGIS Pro二次开发】(38):清理字段值(空格、空值)_第5张图片


二、实现流程

先读取选择的图层要素或独立表,并获取它的Table。这部分可以看以前的文章,直接贴后面的核心代码。

1、字符串:清除空格

最主要就是一个【Replace】的字符串方法,实现去除空格的功能。不过在此之前,需要先排除不可读字段以及字段值为空值的情况。

            // 定位到属性表的游标
            using (var tableCursor = table.Search(null, false))
            {
                while (tableCursor.MoveNext())
                {
                    // 获取当前记录的值
                    var row = tableCursor.Current;
                    // 历数所有字段
                    foreach (var field in fields)
                    {
                        // 排除不可编辑的字段
                        if (field.IsReadOnly == false)
                        {
                            // 如果是字符串类型,则进行下一步
                            if (field.Type == FieldType.String)
                            {
                                var currentValue = row[field.Name];
                                if (currentValue is null)
                                {
                                    continue;
                                }
                                else
                                {
                                    currentValue = currentValue.ToString().Replace(" ", "");
                                }
                                // 更新该字段的值
                                row[field.Name] = currentValue;
                                row.Store(); // 保存修改
                            }
                        }
                    }
                }
            }

2、字符串:清除空值

情况和清除空格类似:

            // 定位到属性表的游标
            using (var tableCursor = table.Search(null, false))
            {
                while (tableCursor.MoveNext())
                {
                    // 获取当前记录的值
                    var row = tableCursor.Current;
                    // 历数所有字段
                    foreach (var field in fields)
                    {
                        // 排除不可编辑的字段
                        if (field.IsReadOnly == false)
                        {
                            // 如果是字符串类型,则进行下一步
                            if (field.Type == FieldType.String)
                            {
                                var currentValue = row[field.Name];
                                if (currentValue is null)
                                {
                                    // 转为""
                                    currentValue = "";
                                }
                                // 更新该字段的值
                                row[field.Name] = currentValue;
                                row.Store(); // 保存修改
                            }
                        }
                    }
                }
            }

3、数字:空值转0

框架内容基本差不多:

            // 定位到属性表的游标
            using (var tableCursor = table.Search(null, false))
            {
                while (tableCursor.MoveNext())
                {
                    // 获取当前记录的值
                    var row = tableCursor.Current;
                    // 历数所有字段
                    foreach (var field in fields)
                    {
                        // 排除不可编辑的字段
                        if (field.IsReadOnly == false)
                        {
                            // 如果是数字类型,则进行下一步
                            if (field.Type == FieldType.Single | field.Type == FieldType.Double | field.Type == FieldType.Integer | field.Type == FieldType.SmallInteger)
                            {
                                var currentValue = row[field.Name];
                                if (currentValue is null)
                                {
                                    // 转为0
                                    currentValue = 0;
                                }
                                // 更新该字段的值
                                row[field.Name] = currentValue;
                                row.Store(); // 保存修改
                            }
                        }
                    }
                }
            }

4、数字:0转空值

【空值转0】的方法赋值方向掉个头就行。

            // 定位到属性表的游标
            using (var tableCursor = table.Search(null, false))
            {
                while (tableCursor.MoveNext())
                {
                    // 获取当前记录的值
                    var row = tableCursor.Current;
                    // 历数所有字段
                    foreach (var field in fields)
                    {
                        // 排除不可编辑的字段
                        if (field.IsReadOnly == false)
                        {
                            // 如果是数字类型,则进行下一步
                                if (field.Type == FieldType.Single | field.Type == FieldType.Double | field.Type == FieldType.Integer | field.Type == FieldType.SmallInteger)
                                {
                                    var currentValue = row[field.Name];
                                    if (currentValue is null)
                                    {
                                        continue;
                                    }
                                    else if (currentValue.Equals(0) || currentValue.Equals(0.0))
                                    {
                                        // 转为空值
                                        currentValue = null;
                                    }
                                    // 更新该字段的值
                                    row[field.Name] = currentValue;
                                    row.Store(); // 保存修改
                                }
                        }
                    }
                }
            }

三、工程文件分享

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

CleanFieldsicon-default.png?t=N4P3https://pan.baidu.com/s/14LKO9y_e1S0YUMdWHGmTuw?pwd=ubpa

PS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。

你可能感兴趣的:(ArcGIS,ArcGIS,Pro,SDK,arcgis,c#,二次开发,arcgis,pro,sdk,空值)