如何拆分机器搜索字符串并匹配数据库?(Microsoft 365环境)
机器部件搜索字符串解析解决方案(Microsoft 365环境)
规则明确
机器部件字符串定义
&XXX:机器明确包含部件XXX-XXX:机器明确不包含部件XXX- 字符串内部件顺序不影响含义,未提及的部件属于「未指定」状态
搜索字符串定义
/表示OR逻辑,分割多个独立的搜索条件组,满足任意一组即匹配成功- 单个条件组内的
&/-表示AND逻辑,需同时满足组内所有明确要求:- 条件组要求
&XXX时,机器必须明确标注&XXX(不能未指定) - 条件组要求
-XXX时,机器必须明确标注-XXX(不能未指定)
- 条件组要求
Microsoft 365实现方案
方案1:Excel公式实现(适合小数据集)
假设机器部件字符串在A列,搜索字符串固定在B1单元格,在C2单元格输入以下公式(Microsoft 365可直接回车):
=OR( BYCOL(TEXTSPLIT(B1,"/"),LAMBDA(cond, AND( ISNUMBER(SEARCH("&"&TEXTBEFORE(TEXTSPLIT(SUBSTITUTE(cond,"-","&-"),"&"),"-",,1),A2)), ISNUMBER(SEARCH("-"&TEXTAFTER(TEXTSPLIT(SUBSTITUTE(cond,"-","&-"),"&"),"-",,1),A2)) ) )) )
公式逻辑:
- 按
/拆分搜索条件组 - 对每个条件组,拆分出「必须包含」(&开头)和「必须不包含」(-开头)的部件
- 检查机器字符串是否同时包含所有要求的
&XXX和-XXX - 只要有一个条件组满足,返回
TRUE,否则FALSE
方案2:Power Query实现(适合大数据集)
- 将机器数据导入Power Query,添加自定义列,输入以下M语言代码(替换
SearchString为目标搜索字符串):
let SearchString = "&XXX-YYY/&YYY&ZZZ", ConditionGroups = Text.Split(SearchString, "/"), CheckCondition = (cond as text, machine as text) as logical => let Parts = List.RemoveItems(Text.Split(Text.Replace(cond, "-", "&-"), "&"), {""}), RequiredPresent = List.Select(Parts, each Text.StartsWith(_, "&")), RequiredAbsent = List.Select(Parts, each Text.StartsWith(_, "-")), AllPresentMatch = List.AllTrue(List.Transform(RequiredPresent, each Text.Contains(machine, _))), AllAbsentMatch = List.AllTrue(List.Transform(RequiredAbsent, each Text.Contains(machine, _))), Result = AllPresentMatch and AllAbsentMatch in Result, CheckAllGroups = List.AnyTrue(List.Transform(ConditionGroups, each CheckCondition(_, [Machine]))) in CheckAllGroups
- 加载回Excel即可得到批量匹配结果
示例验证
| 机器部件字符串 | 匹配结果 | 说明 |
|---|---|---|
&XXX-YYY&ZZZ | TRUE | 满足第一组条件:包含XXX、不包含YYY |
&XXX-YYY-ZZZ | TRUE | 满足第一组条件:包含XXX、不包含YYY |
&XXX&YYY&ZZZ | TRUE | 满足第二组条件:包含YYY、包含ZZZ |
&XXX&ZZZ | FALSE | 两组条件均不满足:第一组要求不包含YYY(机器未指定),第二组要求包含YYY(机器未指定) |
&ZZZ&YYY | TRUE | 满足第二组条件:包含YYY、包含ZZZ(顺序不影响) |
内容的提问来源于stack exchange,提问作者David Killy
相关产品推荐
相关产品推荐

