在做一個屬性入庫的功能,將Excel屬性數據導入到圖層要素當中,這裡Excel和SDE資料庫數據存在一個關聯欄位,通過關聯欄位值進行匹配屬性入庫。 在實際業務中,由於普查數據往往某些欄位值比較複雜,在寫入到圖層中時用戶可能做一些簡化,例如一個要素編號為0532BH001,可能錄入到圖層中只錄入BH0... ...
在做一個屬性入庫的功能,將Excel屬性數據導入到圖層要素當中,這裡Excel和SDE資料庫數據存在一個關聯欄位,通過關聯欄位值進行匹配屬性入庫。
在實際業務中,由於普查數據往往某些欄位值比較複雜,在寫入到圖層中時用戶可能做一些簡化,例如一個要素編號為0532BH001,可能錄入到圖層中只錄入BH001,這樣就導致了圖層要素和Excel文件關聯欄位的值並不一定是完全相等的,可能存在一定的匹配關係。
這裡不考慮複雜的情況,只是考慮Excel中關聯欄位值是要素關聯欄位值加首碼、尾碼或者前尾碼都存在的情況。
因為是以Excel作為基準來迴圈的,構造好欄位值後再圖層中進行Query操作查找到相應的要素,所以不能通過在圖層要素關聯欄位中取出欄位值然後通過連接前尾碼的方式來判斷處理,只能通過對Excel中關聯欄位值進行截取的方式來處理。
根據這裡的實際情況,格式比較固定,移除首碼、尾碼函數如下所示:
1: ///<summary>
2: /// 移除首碼字元串
3: ///</summary>
4: ///<param name="val">原字元串</param>
5: ///<param name="str">首碼字元串</param>
6: ///<returns></returns>
7: private string GetRemovePrefixString(string val, string str)
8: {
9: string strRegex = @"^(" + str + ")";
10: return Regex.Replace(val, strRegex, "");
11: }
12: ///<summary>
13: /// 移除尾碼字元串
14: ///</summary>
15: ///<param name="val">原字元串</param>
16: ///<param name="str">尾碼字元串</param>
17: ///<returns></returns>
18: private string GetRemoveSuffixString(string val, string str)
19: {
20: string strRegex = @"(" + str + ")" + "$";
21: return Regex.Replace(val, strRegex, "");
22: }
延伸,如果對於字元串要求不如此嚴格,只是單純的截取前後字元串,那麼可以通過此種方式進行:
1: ///<summary>
2: /// 截前後字元串
3: ///</summary>
4: ///<param name="val">原字元串</param>
5: ///<param name="str">要截掉的字元串</param>
6: ///<param name="bAllStr">是否對整個字元串進行截取
7: ///如果為true則對整個字元串中匹配的進行截取
8: ///如果為false則只截取首碼或者尾碼</param>
9: ///<returns></returns>
10: private string GetString(string val, string str, bool bAllStr)
11: {
12: return Regex.Replace(val, @"(^(" + str + ")" + (bAllStr ? "*" : "") + "|(" + str + ")" + (bAllStr ? "*" : "") + "$)", "");
13: }
如果是截取單個字元而不是字元串,可以通過TrimStart或者TrimEnd函數來處理:
1: /// <summary>
2: /// 截前後字元
3: /// </summary>
4: /// <param name="val">原字元串</param>
5: /// <param name="c">要截取的字元</param>
6: /// <returns></returns>
7: private string GetString(string val, char c)
8: {
9: return val.TrimStart(c).TrimEnd(c);
10: }