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


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

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

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


加好友 发短信
等级:小狐 帖子:396 积分:3297 威望:0 精华:0 注册:2014/12/13 14:35:00
[求助]批量查找替换  发帖心情 Post By:2017/4/21 16:31:00 [只看该作者]

现有表A,[列a][列b]
数据如下:

[列a]         [列b]

ZL0001   ZL0004
ZL0003   ZL0004
ZL0002   ZL0018
...


表B,
[列1]      [列2]
ZL0001  JLT-10124
ZL0002  JLT-02023
ZL0003  JLT-10121
ZL0004  JLT-45001
...
ZL0018  JLT-12315



请教,如果将表A中[列a][列b]的内容  根据表B的[列1]的内容替换成对应[列2]内容,匹配替换,而非覆盖替换,因为单元格中还存在其他内容,代码如何编辑?



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


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2017/4/21 16:51:00 [只看该作者]

For Each dr As DataRow In DataTables("表a").DataRows
    Dim fdr As DataRow = DataTables("表B").find("第一列 = '" & dr("第一列") & "'")
    If fdr IsNot Nothing Then
        dr("第二列") = fdr("第二列")
    End If
Next

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


加好友 发短信
等级:小狐 帖子:396 积分:3297 威望:0 精华:0 注册:2014/12/13 14:35:00
回复:(有点色)For Each dr As DataRow In DataTabl...  发帖心情 Post By:2017/4/21 17:14:00 [只看该作者]

额,好像这个不是将表A中的两列内容根据表B中的内容同时替换把???


现有表A,[列a][列b]
数据如下:

[列a] [列b]

ZL0001 ZL0004
ZL0003 ZL0004
ZL0002 ZL0018
...


表B,
[列1] [列2]
ZL0001 JLT-10124
ZL0002 JLT-02023
ZL0003 JLT-10121
ZL0004 JLT-45001
...
ZL0018 JLT-12315


希望替换后的效果
表A变成
[列a] [列b]

JLT-10124 JLT-45001
JLT-10121 JLT-45001
JLT-02023 JLT-12315

[此贴子已经被作者于2017/4/21 17:16:49编辑过]

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


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2017/4/21 17:17:00 [只看该作者]

以下是引用13865161910在2017/4/21 17:14:00的发言:
额,好像这个不是将表A中的两列内容根据表B中的内容同时替换把???

 

你根据第一列查找,替换的是第二列。


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


加好友 发短信
等级:小狐 帖子:396 积分:3297 威望:0 精华:0 注册:2014/12/13 14:35:00
回复:(有点色)以下是引用13865161910在2017/4/21 1...  发帖心情 Post By:2017/4/21 17:17:00 [只看该作者]

见附件

 下载信息  [文件大小:   下载次数: ]
点击浏览该文件:管理项目2.foxdb

表C为表A的内容通过查询表B后获得结果

[此贴子已经被作者于2017/4/21 17:31:09编辑过]

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


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2017/4/21 17:35:00 [只看该作者]

Dim cs() As String = {"第一列", "第二列"} '表A要替换的列名
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("第一列 is not null")
            If dr(c).Contains(cdr("第一列")) Then
                dr(c) = dr(c).replace(cdr("第一列"), cdr("第二列"))
                Exit For
            End If
        Next
    Next
Next

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


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2017/4/21 17:37:00 [只看该作者]

Dim cs() As String = {"前号码", "后号码"} '表A要替换的列名
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")
            If dr(c).Contains(cdr("zl号码")) Then
                dr(c) = dr(c).replace(cdr("zl号码"), cdr("jlt号码"))
                Exit For
            End If
        Next
    Next
Next 

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


加好友 发短信
等级:小狐 帖子:396 积分:3297 威望:0 精华:0 注册:2014/12/13 14:35:00
  发帖心情 Post By:2017/4/22 10:17:00 [只看该作者]

以下是引用有点色在2017/4/21 17:37:00的发言:
Dim cs() As String = {"前号码", "后号码"} '表A要替换的列名
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")
            If dr(c).Contains(cdr("zl号码")) Then
                dr(c) = dr(c).replace(cdr("zl号码"), cdr("jlt号码"))
                Exit For
            End If
        Next
    Next
Next  

感谢老师帮助!
[此贴子已经被作者于2017/4/22 10:17:53编辑过]

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


加好友 发短信
等级:小狐 帖子:396 积分:3297 威望:0 精华:0 注册:2014/12/13 14:35:00
回复:(有点色)Dim cs() As String = {"前号码", "后...  发帖心情 Post By:2017/4/22 10:24:00 [只看该作者]

还有个小问题需要请教!
如果表a的某一列,存在两个编码需要根据表B的对照表进行转换,代码需要如何优化?!
比如
表a

   前号码        后号码

ZL0001        ZL0006/ZL0016
...

表b

 ZL号码         JLT号码

ZL0001        JLT-01001
...
ZL0006        JLT-06023
..
ZL0016        JLT-19023


目前替换后的效果是:
   前号码                   后号码
JLT-01001       JLT-06023/ZL0016

需要重复执行一次代码,实现替换效果

能否直接变成?

   前号码                    后号码
JLT-01001       JLT-06023/JLT-19023


另,老师能否给个注释,解释一下这个代码的逻辑分析!毕竟其中有好几个遍历,还有If语句!有点懵

[此贴子已经被作者于2017/4/22 10:25:04编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107028 积分:544371 威望: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],就可以方便的提取号码,不需要循环进行包含判断。当然这样需要数据来源方进行配合。

 回到顶部
总数 16 1 2 下一页