我有一个包含两列的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列中的分号之间找到 - 而不会导致表单的计算一次冻结几分钟?正则表达式是我最初采用的路线,但我希望这些操作是花费这么长时间的原因。
答案 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")