高效细胞配方计算一系列细胞中的子串

时间:2017-11-01 18:16:53

标签: regex count google-sheets formulas array-formulas

我有一个包含两列的Google电子表格:A和C.列A在自己的单元格中有超过一千行名称/主题,而C列有几百行,其中包含上述名称/主题的可变组合它的各种细胞,每个名称/主题用分号与其他名称/主题分开。这些列中的每一列都会在一天中经常获得新条目。

作为设置的一个非常简化的可视化示例:

**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$2:$C$7,"([\(\)\?])", ""),"(\w+),{0,1}\s+(\w+)","$1$2"),".*(^|\s)"& trim(REGEXREPLACE(REGEXREPLACE($A2,"([\(\)\?])", ""),"(\w+),{0,1}\s+(\w+)","$1$2"))&"(;|$).*")))))

这给出了正确的总数,但是一旦你扩大规模,它似乎令人难以置信地加工;更改或向C列添加任何一个条目会导致整个工作表重新计算其数千个条目,并且它需要几分钟才能生成新的总计。这里使用了许多REGEXREPLACE值,因为有些条目的标点符号为“()”和“?”,因为像“Erōs”,“Olympic Games(23rd:1984:Los Angeles,Calif。)”这样的细胞,和“Thomas,Aquinas,Saint,1225?-1274”。

我提出的最接近的计算方法如下:

=SUMPRODUCT((LEN(C$2:C$7)-LEN(SUBSTITUTE(C$2:C$7,A2,"")))/LEN(A2))

测试显示,这个更简单的公式可以在几秒钟内重新计算整个工作表,但它实际上并没有正确计算条目。在C2-C7的上述例子中,它将为“Bob”和“Charles”提供4和5的总和,因为它不区分“Bob”和“Bob Evans”或“Charles”和“Smith,Charles。 “它应该分别找到2和3。

是否有一种有效的方法来调整上述公式或创建一个新的方法,它将正确计算所有子串 - 将总和限制为与A列完全匹配,因为它们在C列中的分号之间找到 - 而不会导致表单的计算一次冻结几分钟?正则表达式是我最初采用的路线,但我希望这些操作是花费这么长时间的原因。

3 个答案:

答案 0 :(得分:1)

尝试
B2:

=SUMPRODUCT(TRIM(A2)=TRIM(SPLIT($C$2:$C$8,";")))

答案 1 :(得分:1)

这可能会让你开始朝着正确的方向前进:

=QUERY(C$2:C,"SELECT count(C) WHERE C CONTAINS ('"&A2&"') OR C CONTAINS upper('"&A2&"') OR C CONTAINS lower('"&A2&"')", -1)

答案 2 :(得分:1)

试试这个:
在某处 Y1:

=QUERY(ARRAYFORMULA(TRIM(TRANSPOSE(SPLIT(CONCATENATE(SPLIT(C2:C6,";")& ""), "")))), "select Col1,Count (Col1) group by Col1")