在做一个属性入库的功能,将Excel属性数据导入到图层要素当中,这里Excel和SDE数据库数据存在一个关联字段,通过关联字段值进行匹配属性入库。
在实际业务中,由于普查数据往往某些字段值比较复杂,在写入到图层中时用户可能做一些简化,例如一个要素编号为0532BH001,可能录入到图层中只录入BH001,这样就导致了图层要素和Excel文件关联字段的值并不一定是完全相等的,可能存在一定的匹配关系。
这里不考虑复杂的情况,只是考虑Excel中关联字段值是要素关联字段值加前缀、后缀或者前后缀都存在的情况。
因为是以Excel作为基准来循环的,构造好字段值后再图层中进行Query操作查找到相应的要素,所以不能通过在图层要素关联字段中取出字段值然后通过连接前后缀的方式来判断处理,只能通过对Excel中关联字段值进行截取的方式来处理。
根据这里的实际情况,格式比较固定,移除前缀、后缀函数如下所示:
///<summary> /// 移除前缀字符串 ///</summary> ///<param name="val">原字符串</param> ///<param name="str">前缀字符串</param> ///<returns></returns> private string GetRemovePrefixString(string val, string str) { string strRegex = @"^(" + str + ")"; return Regex.Replace(val, strRegex, ""); } ///<summary> /// 移除后缀字符串 ///</summary> ///<param name="val">原字符串</param> ///<param name="str">后缀字符串</param> ///<returns></returns> private string GetRemoveSuffixString(string val, string str) { string strRegex = @"(" + str + ")" + "$"; return Regex.Replace(val, strRegex, ""); }
延伸,如果对于字符串要求不如此严格,只是单纯的截取前后字符串,那么可以通过此种方式进行:
///<summary> /// 截前后字符串 ///</summary> ///<param name="val">原字符串</param> ///<param name="str">要截掉的字符串</param> ///<param name="bAllStr">是否对整个字符串进行截取 ///如果为true则对整个字符串中匹配的进行截取 ///如果为false则只截取前缀或者后缀</param> ///<returns></returns> private string GetString(string val, string str, bool bAllStr) { return Regex.Replace(val, @"(^(" + str + ")" + (bAllStr ? "*" : "") + "|(" + str + ")" + (bAllStr ? "*" : "") + "$)", ""); }
如果是截取单个字符而不是字符串,可以通过TrimStart或者TrimEnd函数来处理:
/// <summary> /// 截前后字符 /// </summary> /// <param name="val">原字符串</param> /// <param name="c">要截取的字符</param> /// <returns></returns> private string GetString(string val, char c) { return val.TrimStart(c).TrimEnd(c); }
以上动图由“图斗罗”提供