首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >搜索数组中文本字符串的部分匹配并返回较大长度的匹配

搜索数组中文本字符串的部分匹配并返回较大长度的匹配
EN

Stack Overflow用户
提问于 2015-11-30 22:45:46
回答 3查看 2.3K关注 0票数 0

我有一份地点清单,其中大部分都有一个城镇名称。我想取下这个小镇的名字。然而,一些城镇名称包含在其他名称中,例如"hadley“和"east hadley”。基于这个职位,我找到了两种不同的解决方案(见下图)。但是,根据D列中城镇名称的顺序,结果可能返回较短或更长的名称。我怎样才能得到更完整的比赛呢?我有超过18000张记录,所以需要一个自动化的解决方案。

列B(顶部)中的数组公式和C列(底部)中的公式

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-01 00:10:22

因此,根据我的评论,两个公式都不起作用的原因是excel搜索一个方向直到找到匹配,然后停止搜索,即使有一个更好的匹配。

你的第一个方程是自上而下的,第二个是自下而上的,这就是为什么你得到了不同的答案。

要解决这个问题,搜索区域必须按某种顺序排列。它必须沿着搜索路径从最长的字符串到最短的字符串。

为此,在E中添加一个助手列,将公式Len(D2)放在E2中,然后向下复制。然后对E栏中的D列和E列进行排序:

然后只需使用第一个方程:

如果您喜欢第二列,则对D和E列进行升序排序:

并使用第二个方程:

第三种选择是同时执行这两种操作,并采取最长的步骤,但这是更多的步骤,可以通过简单的搜索列表排序来更快地完成这些步骤。

票数 1
EN

Stack Overflow用户

发布于 2015-11-30 23:05:44

我认为您可以将新列中B和C列的结果与:=IF(LEN(B2)>LEN(C2);B2;C2)进行比较。

票数 0
EN

Stack Overflow用户

发布于 2015-12-01 01:14:02

只是为了给您一个没有排序或帮助列的解决方案:

代码语言:javascript
代码运行次数:0
运行
复制
=INDEX($D$2:$D$6,MAX((MAX(NOT(ISERROR((FIND($D$2:$D$6,A2)>0)))*LEN($D$2:$D$6))=LEN($D$2:$D$6))*NOT(ISERROR(FIND($D$2:$D$6,A2)))*ROW($1:$5)))

或者另一种(稍微快一点)的方式:

代码语言:javascript
代码运行次数:0
运行
复制
=INDEX($D$2:$D$6,MAX((MIN(LEN(SUBSTITUTE(A2,$D$2:$D$6,"")))=LEN(SUBSTITUTE(A2,$D$2:$D$6,"")))*ROW($1:$5)))

但是:我不建议使用.虽然对于小型表是可以的,但是计算的时间对于每一个额外的关键字都会非常长.

此外,如果没有找到匹配项,第一个公式将输出列表中的第一个项,而第二个公式将输出列表的最后一个条目。

最好使用Scott的解决方案,并按长度排序(应该更快,但您可以自己检查)

至少,您还可以像这样使用vba:

代码语言:javascript
代码运行次数:0
运行
复制
Public Function maxMatch(str As String, rng As Range) As String
  Dim cell As Variant
  For Each cell In rng.Value
    If InStr(str, cell) > 0 And Len(cell) > Len(maxMatch) Then maxMatch = cell
  Next
End Function

然后简单地放入单元格=maxMatch(A2,$D$2:$D$6)

(但是,如果不使用VBA,则不算VBA) ;)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34009426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档