【问题标题】:Google Sheets - Matching Company NamesGoogle 表格 - 匹配公司名称
【发布时间】:2018-01-28 03:09:14
【问题描述】:

我有 2 个数据库,都有公司名称,但格式不同。我已经能够使用vlookup 进行精确匹配。我想提取写法不同但实际上是同一家公司的公司并提取数据。

以下是我拥有的数据库的一小部分

Database 1

Column A
1-800-Flowers.com Inc
Abbott Laboratories (Abbott)
21st Century Fox America Inc (formerly News America Inc)

Column B
1234(data I need to grab)
4567
8910

Database 2

Column C                                             
1-800 CONTACTS INC                                 
1-800-FLOWERS.COM                                   
ABBOTT LABORATORIES                                 
TWENTY-FIRST CENTURY FOX INC                        

Column D
ABCD(DataI can ignore as the company doesn't exist in database 1)
EFGH (Data I need as it matches from Database 1)
IJK
LMNO

从上面的数据库中可以看出,数据库 1 与数据库 2 的匹配词类似,例如 21 世纪福克斯美国公司与 21 世纪福克斯公司

在我的数据库 1 中,我有大约 4000 多个值,而在数据库 2 中,我有 10,000 个值。是否有代码可以比较两个数据库之间的相似词并从 B 列和 D 列中提取我需要的数据?

我已经尝试过查询,但它并没有按照我想要的方式工作。 This is my shareable link.

目前,我所做的是使用 REEXTRACT 提取相似的单词,以在 21st Century Fox 和 Twenty-F​​irst Century Fox 等字符串之间找到匹配项,并尝试使用查询匹配两个数据集。但是,当我这样写时,我的查询结果出现了 NA

=query(E:E,"Select E where E contains '"&L2&"'",0 )

L2 是包含字符串 Century Fox 的单元格

【问题讨论】:

  • 您是否对 excel 解决方案感兴趣,或者您是否只是添加了该标签以示好笑?
  • 你的代码在哪里?
  • 道歉。我拿错了链接。我之前没有得到共享链接。我现在添加了它@SherylHohman
  • @Jeeped 我正在寻找谷歌表格解决方案。我发帖之前没有检查链接,但是链接现在可以使用了

标签: database google-sheets fuzzy-search fuzzy


【解决方案1】:

L2:

=ARRAYFORMULA(INDEX($E$2:$E$68,MATCH(MAX(ARRAY_CONSTRAIN(MMULT(LEN(IFERROR(VLOOKUP(SPLIT($E$2:$E$68," "),transpose(SPLIT(A2," ")),1,0))),ROW(A$1:A$7)^0),ROW(E68),7)),ARRAY_CONSTRAIN(MMULT(LEN(IFERROR(VLOOKUP(SPLIT($E$2:$E$68," "),transpose(SPLIT(A2," ")),1,0))),ROW(A$1:A$7)^0),ROW(E68),7),0)))

M2:

=ARRAYFORMULA(INDEX($E$2:$F$68,MATCH(MAX(ARRAY_CONSTRAIN(MMULT(LEN(IFERROR(VLOOKUP(SPLIT($E$2:$E$68," "),transpose(SPLIT(A2," ")),1,0))),ROW(A$1:A$7)^0),ROW(E68),7)),ARRAY_CONSTRAIN(MMULT(LEN(IFERROR(VLOOKUP(SPLIT($E$2:$E$68," "),transpose(SPLIT(A2," ")),1,0))),ROW(A$1:A$7)^0),ROW(E68),7),0),2))

N2:

=ARRAYFORMULA(TEXT(MAX(ARRAY_CONSTRAIN(MMULT(LEN(IFERROR(VLOOKUP(SPLIT($E$2:$E$68," "),transpose(SPLIT(A2," ")),1,0))),ROW(A$1:A$7)^0),ROW(E68),7))/LEN(A2),"0%"))

向下拖动填充。

注意事项:

  • 公式是资源密集型的。 Apps 脚本可能是更好的选择。

  • 对于给定的样本,此公式以合理的精度工作。

  • 7 是在所有 E 列(或数据库 2 的 C 列)中找到的每个单元格的最大字数。这在上面的公式中是硬编码的。这应该使用辅助列找到。 Z2:COUNTA (SPLIT(A2," ")) 向下拖动填充。而AA2:=MAX(Z2:Z)

  • N 列给出了对 VLOOKUP 生成结果的置信度。最好手动重新检查低于 45% 的任何内容。

  • 它是如何工作的:E 列 (db2) 的所有内容都按单词拆分,并且在 A 列 (db1) 的每个条目中查看每个单词。如果 E 列中的多个条目匹配一组单词,则取匹配单词长度的最大值,并将其作为可能匹配项。字母方法而不是单词方法可能会提供更好的精度,但在给定的示例中似乎没有必要。

【讨论】:

  • 谢谢@I'-'I。我现在正在 Google 表格上查看您的代码。
猜你喜欢
  • 2019-01-26
  • 2013-12-04
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
  • 2021-09-26
相关资源
最近更新 更多