[英]Extracting rows in Arrayformula
我认为这是一个简单的语法问题。 我正在从字符串中提取关键字。 关键字集在一列中,源字符串在单独的列中。
我希望相邻列中每个字符串的关键字结果在结果列的头部使用单个 arrayformula 类型构造。 我对 QUERY、FILTER 或任何其他类型的动态数组公式持开放态度。
真实世界的电子表格有一个不确定大小的测试字符串列,范围从零个条目到大约 4000 个,具体取决于构建查询。 关键字列也是动态的,当系统需要append或删除关键字时会发生变化。 目前只有大约 60 行。 每个字符串有四个结果的限制,匹配关键字没有特定的优先级,并且对它们出现的顺序没有限制。
关键字可以是任意数量的单词。 所以 'Tree' 和 'Tall Tree' 将是两行。 较长的关键字字符串始终优先。 例如,字符串“I have a tall tree in my garden”的关键字结果将是“Tall Tree”而不是“Tree, Tall Tree”。
一个简短的示例:我的关键字集(A 列 - 并在此处给出“myWords”的命名范围):
ate
blue
cat
the cat
for
dead
bob
alive
我要测试的字符串(B 列):
Bob ate the dead cat
The cat ate live bob
No cat ate live dog
Bob is dead
Bob and the cat are alive
我的预期结果(C 列):
Bob, Ate, Dead, Cat
The Cat, Ate, Bob
Cat, Ate
Bob, Dead
Bob, The Cat, Alive
示例电子表格在这里。
如果我复制以下公式,我会得到预期的结果。
=PROPER(TEXTJOIN(", ",TRUE,ArrayFormula(IFERROR(REGEXREPLACE($A2,REGEXREPLACE($A2,"(?i)("&TEXTJOIN("|",TRUE,myWords)&")","(.*)"),{"$1","$2","$3","$4"})))))
好的结果,不需要的方法:
Bob, Ate, Dead, Cat
The Cat, Ate, Bob
Cat, Ate
Bob, Dead
Bob, The Cat, Alive
如果我构造一个 arrayformula 版本,那么我会得到正确的结果,但都在第一行。
=arrayformula(PROPER(TEXTJOIN(", ",TRUE,IFERROR(REGEXREPLACE($A$2:$A$20,REGEXREPLACE($A$2:$A$20,"(?i)("&TEXTJOIN("|",TRUE,myWords)&")","(.*)"),{"$1","$2","$3","$4"})))))
不需要的结果,首选方法类型:
Bob, Ate, Dead, Cat, The Cat, Ate, Bob, Cat, Ate, Bob, Dead, Bob, The Cat, Alive
我觉得答案会简单得令人尴尬——但我就是做不到!
2020 年 12 月 31 日更新以下player0
的回答是完美的解决方案。 示例电子表格已使用此答案更新。
采用:
=ARRAYFORMULA(REGEXREPLACE(TRIM(FLATTEN(QUERY(TRANSPOSE(
PROPER(IFERROR(REGEXREPLACE(B2:B14, REGEXREPLACE(B2:B14, "(?i)("&
TEXTJOIN("|", 1, myWords)&")", "(.*)"),
{"$1,", "$2,", "$3,", "$4,"})))),,9^9))), ",$", ))
=ARRAYFORMULA(REGEXREPLACE(TRIM(FLATTEN(QUERY(TRANSPOSE(
PROPER(IFERROR(REGEXREPLACE(REGEXREPLACE(B2:B14, "\+", "♂"),
REGEXREPLACE(REGEXREPLACE(B2:B14, "\+", "♂"), "(?i)("&
TEXTJOIN("|", 1, Answer!myWords)&")", "(.*)"),
{"$1,", "$2,", "$3,", "$4,"})))),,9^9))), ",$", ))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.