使用单元格公式计算一系列单元格中重复出现的子字符串的数量
Counting the number of recurring substrings in a range of cells with a cell formula
我正在尝试统计出现在 Google Sheet 列的单元格范围内的子字符串的出现次数,但我有一个小的并发症,它阻止了快速简单的解决方案计算正确的总数。我在下面整理了一个相对简单的示例 table(抱歉格式化)来演示:
A 列: 姓名 | B 列: 次出现 | C 列: 列表
A2: 亚当 | B2: [空白] | C2:查尔斯;亚当
A3: 鲍勃 | B3: [空白] | C3:亚当
A4: 查尔斯 | B4: [空白] | C4:史密斯,查尔斯
A5: 史密斯,查尔斯 | B5: [空白] | C5:鲍勃埃文斯
A6: 鲍勃·埃文斯 | B6: [空白] | C6: 史密斯、查尔斯;查尔斯;鲍勃
A7: [空白] | B7: [空白] | C7:鲍勃·埃文斯;查尔斯;鲍勃
A8: [空白] | B8: [空白] | C8: [等]
我正在搜索的名称在 A 列中。C 列有实际列表,其中出现的每个名称(在 A 列中找到)都与其他带有分号的子字符串偏移。作为参考,C 列在我的原始工作表中有数百行深,并且会随着更多数据的添加而继续增长。
现在,我用过
=COUNTIF(C:C," * "&A2&" * ")
在 B2 等中计算名称出现的单元格数,但当 A 列中单元格中的一个字符串作为 A 列其他位置的子字符串出现时,它无法正确计算总数。
A 列: 姓名 | B 列: 次出现 | C 列: 列表
A2: 亚当 | B2:2 | C2:查尔斯;亚当
A3: 鲍勃 | B3: 3 [不正确] | C3:亚当
A4: 查尔斯 | B4: 4 [不正确] | C4:史密斯,查尔斯
A5: 史密斯,查尔斯 | B5:2 | C5:鲍勃埃文斯
A6: 鲍勃·埃文斯 | B6:2 | C6: 史密斯、查尔斯;查尔斯;鲍勃
A7: [空白] | B7:2 | C7:鲍勃·埃文斯;查尔斯;鲍勃
例如,尽管我需要的 A3 中的确切字符串(“Bob”)在 C 列列表中仅出现两次,但 B3 中的 "COUNTIF" 公式还包括 C5 的“Bob Evans”(但不计算 C7 内容末尾的“Bob”,因为该单元格同样已被计算为“Bob Evans”)。同样,“Charles”的计数包括所有可能只有“Smith, Charles”但应该只找到“Charles”的单元格。
我想解决方案可能涉及 "SPLIT" 或 "REGEXEXTRACT" 只计算子字符串,因为它们恰好出现在它们的 A 列单元格中,但我的尝试没有得到正确的总数所以远的。欢迎任何有关如何使用此设置获得正确结果的指导(子字符串以分号分隔并使用单元格公式搜索该列的范围)。
B3:
=ARRAYFORMULA(IF(A3="","",(SUMPRODUCT(REGEXMATCH(REGEXREPLACE($C:$C,"(\w+),{0,1}\s+(\w+)",""),".*(^|\s)"& trim(REGEXREPLACE($A3,"(\w+),{0,1}\s+(\w+)",""))&"(;|$).*")))))
我们使用REGEXREPLACE
来查找像Smith, Charles
这样的双名并将它们组合成一个实体(在A3(名称列)和C3:C7(列表列)
然后我们用REGEXMATCH
查找修改后的A3在修改后的C3:C7
中是否匹配
然后,我们使用SUMPRODUCT
添加它们
注意: 如果您已正确提供所有格式(包括空格数,,
和 ;
,这将完美地工作。如果你在问题中搞砸了,那么这将不起作用,你将不得不弄清楚如何使其适应你的实际格式。
我正在尝试统计出现在 Google Sheet 列的单元格范围内的子字符串的出现次数,但我有一个小的并发症,它阻止了快速简单的解决方案计算正确的总数。我在下面整理了一个相对简单的示例 table(抱歉格式化)来演示:
A 列: 姓名 | B 列: 次出现 | C 列: 列表
A2: 亚当 | B2: [空白] | C2:查尔斯;亚当
A3: 鲍勃 | B3: [空白] | C3:亚当
A4: 查尔斯 | B4: [空白] | C4:史密斯,查尔斯
A5: 史密斯,查尔斯 | B5: [空白] | C5:鲍勃埃文斯
A6: 鲍勃·埃文斯 | B6: [空白] | C6: 史密斯、查尔斯;查尔斯;鲍勃
A7: [空白] | B7: [空白] | C7:鲍勃·埃文斯;查尔斯;鲍勃
A8: [空白] | B8: [空白] | C8: [等]
我正在搜索的名称在 A 列中。C 列有实际列表,其中出现的每个名称(在 A 列中找到)都与其他带有分号的子字符串偏移。作为参考,C 列在我的原始工作表中有数百行深,并且会随着更多数据的添加而继续增长。
现在,我用过
=COUNTIF(C:C," * "&A2&" * ")
在 B2 等中计算名称出现的单元格数,但当 A 列中单元格中的一个字符串作为 A 列其他位置的子字符串出现时,它无法正确计算总数。
A 列: 姓名 | B 列: 次出现 | C 列: 列表
A2: 亚当 | B2:2 | C2:查尔斯;亚当
A3: 鲍勃 | B3: 3 [不正确] | C3:亚当
A4: 查尔斯 | B4: 4 [不正确] | C4:史密斯,查尔斯
A5: 史密斯,查尔斯 | B5:2 | C5:鲍勃埃文斯
A6: 鲍勃·埃文斯 | B6:2 | C6: 史密斯、查尔斯;查尔斯;鲍勃
A7: [空白] | B7:2 | C7:鲍勃·埃文斯;查尔斯;鲍勃
例如,尽管我需要的 A3 中的确切字符串(“Bob”)在 C 列列表中仅出现两次,但 B3 中的 "COUNTIF" 公式还包括 C5 的“Bob Evans”(但不计算 C7 内容末尾的“Bob”,因为该单元格同样已被计算为“Bob Evans”)。同样,“Charles”的计数包括所有可能只有“Smith, Charles”但应该只找到“Charles”的单元格。
我想解决方案可能涉及 "SPLIT" 或 "REGEXEXTRACT" 只计算子字符串,因为它们恰好出现在它们的 A 列单元格中,但我的尝试没有得到正确的总数所以远的。欢迎任何有关如何使用此设置获得正确结果的指导(子字符串以分号分隔并使用单元格公式搜索该列的范围)。
B3:
=ARRAYFORMULA(IF(A3="","",(SUMPRODUCT(REGEXMATCH(REGEXREPLACE($C:$C,"(\w+),{0,1}\s+(\w+)",""),".*(^|\s)"& trim(REGEXREPLACE($A3,"(\w+),{0,1}\s+(\w+)",""))&"(;|$).*")))))
我们使用
REGEXREPLACE
来查找像Smith, Charles
这样的双名并将它们组合成一个实体(在A3(名称列)和C3:C7(列表列)然后我们用
REGEXMATCH
查找修改后的A3在修改后的C3:C7 中是否匹配
然后,我们使用
SUMPRODUCT
添加它们
注意: 如果您已正确提供所有格式(包括空格数,,
和 ;
,这将完美地工作。如果你在问题中搞砸了,那么这将不起作用,你将不得不弄清楚如何使其适应你的实际格式。