在做一個屬性入庫的功能,將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); }