在数组中搜索文本字符串的部分匹配并返回更长的匹配

时间:2015-11-30 22:45:46

标签: excel excel-formula

我有一个地点列表,其中大部分都包含一个城镇名称。我想提取城镇名称。但是,一些城镇名称包含在其他名称中,例如“hadley”和“east hadley”。根据{{​​3}},我找到了两个不同的解决方案来解决我的问题(见下图)。但是,根据D列中城镇名称的顺序,结果可能会返回更短或更长的名称。我怎样才能始终获得更完整的匹配?我有超过18000条记录,因此需要一个自动化解决方案。

this post

3 个答案:

答案 0 :(得分:1)

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

你的第一个等式是自上而下搜索,第二个等式是自下而上搜索,这就是你得到不同答案的原因。

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

为此,请在E中添加辅助列。将公式Len(D2)放入E2并向下复制。然后对E列上的D和E列进行排序:

enter image description here

然后你只需要使用第一个等式:

enter image description here

如果您喜欢第二个,请按列D和E升序排序:

enter image description here

并使用第二个等式:

enter image description here

第三种选择是同时做两次并花费最长时间,但通过简单地对搜索列表进行排序,可以更快地完成更多步骤。

答案 1 :(得分:0)

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

答案 2 :(得分: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)))

或另一种(略快)方式:

=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 Carner的解决方案,按长度排序(应该更快,但你可以自己检查)

至少,你也可以像这样使用vba:

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所以不计算在内);)