【问题标题】:Extracting rows in Arrayformula在 Arrayformula 中提取行
【发布时间】:2021-04-07 11:56:55
【问题描述】:

我认为这是一个简单的语法问题。我正在从字符串中提取关键字。关键字集在一个列中,源字符串在一个单独的列中。

我想要在结果列的头部使用单个 arrayformula 类型构造的相邻列中每个字符串的关键字结果。我对 QUERY、FILTER 或任何其他类型的动态数组公式持开放态度。

现实世界的电子表格有一个大小不定的测试字符串列,从零条目到大约 4000 个条目不等,具体取决于构建查询。关键字列也是动态的,当系统需要追加或删除关键字时会发生变化。它目前只有大约 60 行。每个字符串有四个结果的限制,匹配关键字没有特定的优先级,也没有限制它们出现的顺序。

关键字可以是任意数量的单词。所以“树”和“高树”将是两行。较长的关键字字符串始终优先。例如,字符串“我的花园里有一棵高大的树”的关键字结果将是“高大的树”而不是“树,高大的树”。

一个简短的例子: 我的关键字集(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

示例电子表格是here

如果我抄下以下公式,我会得到预期的结果。

=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(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 下面的答案是完美的解决方案。已使用此答案更新了示例电子表格。

【问题讨论】:

    标签: google-sheets array-formulas


    【解决方案1】:

    使用:

    =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))), ",$", ))
    

    【讨论】:

    • 完美运行。谢谢你。 'TRIM(FLATTEN(QUERY(TRANSPOSE(' Jeez,我永远不会想出这个。我希望其他人能像我一样从中学到很多东西。感谢。
    • 将您的解决方案应用于现实世界的数据我遇到了麻烦。如果源字符串以一个以 +1 结尾的字符结尾(如在 'V+1' 中),则整个字符串被捕获 4 次。请有任何直接的想法为什么会发生这种情况?
    • @DeeKay789 你能分享一份你的工作表或一些样本吗?
    • 是的,谢谢,我在原始共享中添加了一个“哎呀”表。
    • 像魅力一样工作。非常感谢。谢谢你。 2021 年过得愉快
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 2022-09-27
    • 2021-09-23
    • 2019-04-09
    • 1970-01-01
    • 2015-07-05
    相关资源
    最近更新 更多