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