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


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

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

帅哥哟,离线,有人找我吗?
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]内容,匹配替换,而非覆盖替换,因为单元格中还存在其他内容,代码如何编辑?



 回到顶部
帅哥哟,离线,有人找我吗?
13865161910
  2楼 | 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编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
13865161910
  3楼 | 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编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
13865161910
  4楼 | 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
  5楼 | 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编辑过]

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


加好友 发短信
等级:小狐 帖子:396 积分:3297 威望:0 精华:0 注册:2014/12/13 14:35:00
回复:(有点蓝)7楼代码把Exit For去掉就行了。你这个...  发帖心情 Post By:2017/4/22 11:23:00 [显示全部帖子]

首先感谢您的耐心解答!
刚刚根据您提供的代码特意对不明白的词汇,看了帮助
判断应该是exit for的问题!

您提到的表A格式为[ZL0006]/[ZL0016],方便提取,是指表A中某列的格式为这样还是?目前表A有[前号码][后号码]两列,这两列,有一小部分的行,存在其中一列有“/”分割开的两个数据

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


加好友 发短信
等级:小狐 帖子:396 积分:3297 威望:0 精华:0 注册:2014/12/13 14:35:00
回复:(有点蓝)不是分割不分割的问题。所有的号码都...  发帖心情 Post By:2017/4/22 15:11:00 [显示全部帖子]

号码框起来 有什么不一样吗?“方便”代码处理是怎么个“方便”法?提高代码运行速度?!会直接针对性的遍历搜索[]中的内容?
[此贴子已经被作者于2017/4/22 15:12:09编辑过]

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


加好友 发短信
等级:小狐 帖子:396 积分:3297 威望:0 精华:0 注册:2014/12/13 14:35:00
回复:(有点蓝)可以通过正则表达式一次性提取[]中的...  发帖心情 Post By:2017/4/22 15:18:00 [显示全部帖子]

那如果号码都被[]框起来,代码如何优化?可以不用For each...In....语句?
正则表达式,帮助文件搜索没搜索到相关资源


正则表达式 - 语法
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
例如:
runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少出现一次(1次或多次)。
runoo*b,可以匹配 runob、runoob、runoooooob 等,* 号代表字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)。
colou?r 可以匹配 color 或者 colour,? 问号代表前面的字符最多只可以出现一次(0次、或1次)。



参考代码


Dim str As String = "原约45×34mm,现为36×23mm"
Dim mc = System.Text.RegularExpressions.Regex.Matches(str, "[0-9.]+×[0-9.]+")
msgbox(mc(0).value)
msgbox(mc(1).value)


上面代码是在其他帖子中您回复的,这是用了正则表达式吗?看不懂第二行定义的含义

图片点击可在新窗口打开查看,彻底被这个表达式的匹配含义整晕乎了!一是数据源有要求,而还要掌握这个语法....
[此贴子已经被作者于2017/4/22 15:37:18编辑过]

 回到顶部