由于一些不规范的输入,或是其它数据转换而来,要素类或者独立表的字段值经常含有空值、空格等影响数据质量的内容。
这个工具的目的就是清理、转换这些字段内容,提高数据质量。
一、要实现的功能
如上图所示,点击【清洗字段值】按钮,在弹出的工具框中,选择要素图层或独立表,再选择一种处理模式,点击执行即可。
这里的【处理模式】有4种,【字符串:清除空格;字符串:清除空值;数字:空值转0;数字:0转空值】。功能如字面意思,很好理解。
1、字符串:清除空格
将输入图层的【所有字符串型字段】中的空格清除,不管处在哪个位置。
工具执行前后对比如下:
2、字符串:清除空值
将输入图层的【所有字符串型字段】中的空值清除,结果不含任何文字。
工具执行前后对比如下:
3、数字:空值转0
将输入图层的【所有数字型字段】中的空值转换为0值。
工具执行前后对比如下:
4、数字:0转空值
将输入图层的【所有数字型字段】中的0值转换为空值。
工具执行前后对比如下:
二、实现流程
先读取选择的图层要素或独立表,并获取它的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(); // 保存修改
}
}
}
}
}
三、工程文件分享
最后,放上工程文件的链接:
CleanFieldshttps://pan.baidu.com/s/14LKO9y_e1S0YUMdWHGmTuw?pwd=ubpa
PS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。