Foxtable(狐表)用户栏目专家坐堂 → [求助]批量查找替换


  共有3592人关注过本帖树形打印复制链接

主题:[求助]批量查找替换

帅哥哟,离线,有人找我吗?
有点蓝
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:113766 积分:579397 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2017/4/22 10:58:00 [显示全部帖子]

7楼代码把Exit For去掉就行了。

你这个逻辑也就只能这样处理,慢是肯定的

For Each dr As DataRow In DataTables("表a").DataRows 逐行循环替换
    For Each c As String In cs 循环需要替换的列
        For Each cdr As DataRow In DataTables("表B").Select("zl号码 is not null") 循环所有表B号码不为空的行
            If dr(c).Contains(cdr("zl号码")) Then 如果表A某行某列的内容包含这个zl号码
                dr(c) = dr(c).replace(cdr("zl号码"), cdr("jlt号码"))进行替换
                Exit For退出此单元格的替换操作,如果一个单元格有多个号码要替换,去掉这行代码
            End If
        Next
    Next
Next 

要想优化代码,要对录入的数据做一些限定,比如表A存储的号码是这样:[ZL0006]/[ZL0016],就可以方便的提取号码,不需要循环进行包含判断。当然这样需要数据来源方进行配合。

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:113766 积分:579397 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2017/4/22 12:01:00 [显示全部帖子]

不是分割不分割的问题。所有的号码都用中括号括起来表示,如[某号码],方便代码的处理,就是增加了录入的工作

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:113766 积分:579397 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2017/4/22 15:14:00 [显示全部帖子]

可以通过正则表达式一次性提取[]中的内容,然后进行针对性的查询,可以减少不少循环,提供效率和速度

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:113766 积分:579397 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2017/4/22 16:01:00 [显示全部帖子]

正则是一种比较另类的用法,难于理解,不属于帮助的内容,需要自己摸索学习,网上这方面的资料比较多。

Dim cs() As String = {"前号码", "后号码"} '表A要替换的列名
Dim p As String = "\[[0-9a-zA-Z ]+\]"
Dim rgx = new System.Text.RegularExpressions.Regex(p, System.Text.RegularExpressions.RegexOptions.IgnoreCase)
Dim fdr As DataRow
For Each dr As DataRow In DataTables("表a").Select("前号码 is not null or 后号码 is not null")
    For Each c As String In cs
        Dim drv As String = dr(c)
        For Each v As System.Text.RegularExpressions.Match In rgx.Matches(drv)
            fdr = DataTables("表B").Find("zl号码='" & v.value.Trim("[","]") & "'")
            If fdr IsNot Nothing Then
                drv = drv.replace( v.value, fdr("jlt号码"))
            End If
        Next
        dr(c) = drv
    Next
Next



 回到顶部