单元格范围内子串的高效单元格公式计数
Efficient cell formula counting of substrings in a range of cells
我有一个包含两列的 Google spreadsheet:A 和 C。A 列在它们自己的单元格中有超过一千行 names/subjects,C 列有几行一百行,在其各个单元格中具有上述 names/subjects 的可变组合,每个 name/subject 与其他单元格之间用分号分隔。这些列中的每一个都会在一天中频繁获得新条目。
作为设置的一个非常简化的视觉示例:
**Column A: Names | Column B: Occurrences | Column C: List**
A2: Adam | B2: [Blank] | C2: Charles; Adam
A3: Bob | B3: [Blank] | C3: Adam
A4: Charles | B4: [Blank] | C4: Smith, Charles
A5: Smith, Charles | B5: [Blank] | C5: Bob Evans
A6: Bob Evans | B6: [Blank] | C6: Smith, Charles; Charles; Bob
A7: [etc.] | B7: [Blank] | C7: Bob Evans; Charles; Bob
A8: [etc.] | B8: [Blank] | C8: [etc.]
目前,我正在使用以下公式计算 A 列(此处为 A2)中的每个字符串作为子字符串出现在 C 列(此处为 C2 到 C7)中的次数:
=ARRAYFORMULA(IF(A2="","",(SUMPRODUCT(REGEXMATCH(REGEXREPLACE(REGEXREPLACE($C:$C,"([\(\)\?])", ""),"(\w+),{0,1}\s+(\w+)",""),".*(^|\s)"& trim(REGEXREPLACE(REGEXREPLACE($A2,"([\(\)\?])", ""),"(\w+),{0,1}\s+(\w+)",""))&"(;|$).*")))))
这给出了正确的总数,但是一旦你扩大规模,它的处理量似乎令人难以置信;更改或添加任何一个条目到 C 列会导致整个 sheet 重新计算其数千个条目,并且需要几分钟才能得出新的总数。这里使用了很多 REGEXREPLACE 值,因为一些条目有像“()”和“?”这样的标点符号,考虑到像“Erōs”、“Olympic Games (23rd : 1984 : Los Angeles, Calif.)”这样的单元格,和“圣托马斯·阿奎那,1225?-1274”。
我想出的最接近计数的替代方案如下:
=SUMPRODUCT((LEN(C:C)-LEN(SUBSTITUTE(C:C,A2,"")))/LEN(A2))
测试表明,这个简单得多的公式可以在几秒钟内重新计算整个 sheet,但它实际上并没有正确计算条目。在上面的 C2-C7 示例中,“Bob”和“Charles”的总分分别为 4 和 5,因为它没有区分“Bob”和“Bob Evans”或“Charles”和“Smith, Charles”。 ”它应该分别正确找到 2 和 3。
是否有一种有效的方法来调整上述公式或创建一个新的公式来正确计算所有子字符串——将总和限制为与列 A 完全匹配,因为它们位于列 C 的分号之间——而不会导致sheet 的计算一次冻结几分钟?正则表达式是我最初选择的路线,但我希望这些操作是花费这么长时间的原因。
尝试
B2:
=SUMPRODUCT(TRIM(A2)=TRIM(SPLIT($C:$C,";")))
这可能会让您朝着正确的方向开始:
=QUERY(C:C,"SELECT count(C) WHERE C CONTAINS ('"&A2&"') OR C CONTAINS upper('"&A2&"') OR C CONTAINS lower('"&A2&"')", -1)
也试试这个:
在某处
Y1:
=QUERY(ARRAYFORMULA(TRIM(TRANSPOSE(SPLIT(CONCATENATE(SPLIT(C2:C6,";")& ""), "")))), "select Col1,Count (Col1) group by Col1")
我有一个包含两列的 Google spreadsheet:A 和 C。A 列在它们自己的单元格中有超过一千行 names/subjects,C 列有几行一百行,在其各个单元格中具有上述 names/subjects 的可变组合,每个 name/subject 与其他单元格之间用分号分隔。这些列中的每一个都会在一天中频繁获得新条目。
作为设置的一个非常简化的视觉示例:
**Column A: Names | Column B: Occurrences | Column C: List**
A2: Adam | B2: [Blank] | C2: Charles; Adam
A3: Bob | B3: [Blank] | C3: Adam
A4: Charles | B4: [Blank] | C4: Smith, Charles
A5: Smith, Charles | B5: [Blank] | C5: Bob Evans
A6: Bob Evans | B6: [Blank] | C6: Smith, Charles; Charles; Bob
A7: [etc.] | B7: [Blank] | C7: Bob Evans; Charles; Bob
A8: [etc.] | B8: [Blank] | C8: [etc.]
目前,我正在使用以下公式计算 A 列(此处为 A2)中的每个字符串作为子字符串出现在 C 列(此处为 C2 到 C7)中的次数:
=ARRAYFORMULA(IF(A2="","",(SUMPRODUCT(REGEXMATCH(REGEXREPLACE(REGEXREPLACE($C:$C,"([\(\)\?])", ""),"(\w+),{0,1}\s+(\w+)",""),".*(^|\s)"& trim(REGEXREPLACE(REGEXREPLACE($A2,"([\(\)\?])", ""),"(\w+),{0,1}\s+(\w+)",""))&"(;|$).*")))))
这给出了正确的总数,但是一旦你扩大规模,它的处理量似乎令人难以置信;更改或添加任何一个条目到 C 列会导致整个 sheet 重新计算其数千个条目,并且需要几分钟才能得出新的总数。这里使用了很多 REGEXREPLACE 值,因为一些条目有像“()”和“?”这样的标点符号,考虑到像“Erōs”、“Olympic Games (23rd : 1984 : Los Angeles, Calif.)”这样的单元格,和“圣托马斯·阿奎那,1225?-1274”。
我想出的最接近计数的替代方案如下:
=SUMPRODUCT((LEN(C:C)-LEN(SUBSTITUTE(C:C,A2,"")))/LEN(A2))
测试表明,这个简单得多的公式可以在几秒钟内重新计算整个 sheet,但它实际上并没有正确计算条目。在上面的 C2-C7 示例中,“Bob”和“Charles”的总分分别为 4 和 5,因为它没有区分“Bob”和“Bob Evans”或“Charles”和“Smith, Charles”。 ”它应该分别正确找到 2 和 3。
是否有一种有效的方法来调整上述公式或创建一个新的公式来正确计算所有子字符串——将总和限制为与列 A 完全匹配,因为它们位于列 C 的分号之间——而不会导致sheet 的计算一次冻结几分钟?正则表达式是我最初选择的路线,但我希望这些操作是花费这么长时间的原因。
尝试
B2:
=SUMPRODUCT(TRIM(A2)=TRIM(SPLIT($C:$C,";")))
这可能会让您朝着正确的方向开始:
=QUERY(C:C,"SELECT count(C) WHERE C CONTAINS ('"&A2&"') OR C CONTAINS upper('"&A2&"') OR C CONTAINS lower('"&A2&"')", -1)
也试试这个:
在某处
Y1:
=QUERY(ARRAYFORMULA(TRIM(TRANSPOSE(SPLIT(CONCATENATE(SPLIT(C2:C6,";")& ""), "")))), "select Col1,Count (Col1) group by Col1")