【问题标题】:How can I create the equivalent of an explode(), implode() pattern match approach in Google Sheets using formulas?如何使用公式在 Google 表格中创建等效于 explode()、implode() 模式匹配方法?
【发布时间】:2016-06-25 17:29:14
【问题描述】:

这是我的目标:

我有以下数据集:

据此,我想生成以下内容:

为了 RTFM 的利益,这是我的思考过程和我尝试过的:

首先,顶部集合的两列分别位于各自的命名范围内:Color_Abbrevs、Category_Names。

我知道我可以使用 JOIN() 从类别名称中生成类别输出中的结果,如下所示:

JOIN("/",Category_Names)

我现在面临的挑战是如何创建一种“模式匹配器”(我不知道还能怎么称呼它),从而我可以使用缩写代替类别名称来呈现结果字符串。所需图案格式的示例显示在 A8:A10 中。

首先,我尝试使用类似 INDEX 和 MATCH 的方法进行思考:

=INDEX(Category_Names,MATCH(LEFT(A8,FIND("/",A8)-1),Category_Abbrevs,0))

这会在 A9 中产生正确的值,所以我认为我可能走在正确的轨道上。我坚持的部分是如何将 JOIN 和 INDEX 和 MATCH 公式连接在一起,以允许可变长度的缩写和类别。

理想情况下,我希望能够继续向顶级数据集添加值,并通过第二个数据集在列表中定义我需要的任何唯一“模式”以获得所需的结果。

这是否可以使用公式,或者我需要编写一些谷歌脚本来实现它?

编辑:B8 和 B9 行都有错别字(道歉)。 B8 应显示“Tile Daily Store/Porcelain”,B9 应显示“Tile Depot Store/Metallic Porcelain”。

【问题讨论】:

  • 只是为了说明:第 9 行显示 TDS/MP 但返回“Porcelain Mosaic”而不是“Metallic Porcelain”......同样第 8 行只返回“TDS”并忽略“PT”。 . 是错别字吗?
  • 是的,确实如此。我已经在帖子中添加了一个 EDIT —— 感谢您看到它。
  • 您想要 excel 答案还是只需要 Google 表格?

标签: excel google-sheets


【解决方案1】:

或者,您也可以使用公式(在 B8 处):

=ARRAYFORMULA(JOIN("/";LOOKUP(SPLIT(A8;"/");$A$2:$A$6;$B$2:$B$6)))

在 Google 表格中以与“结构”相同的顺序获取“类别输出”

编辑

看起来我在这里错过了一些东西:P

=ARRAYFORMULA(JOIN("/";VLOOKUP(SPLIT(A8;"/";TRUE);$A$2:$B$6;2;FALSE())))

如果所有内容也在列表中,将执行(如果没有找到,它将完全出错)

=ARRAYFORMULA(JOIN("/";IFERROR(VLOOKUP(SPLIT(A8;"/";TRUE);$A$2:$B$6;2;FALSE());"---")))

这将为每个未找到的部分显示“---”...

【讨论】:

  • 当我尝试在 A8 中使用上图所示的值时,我得到“Porcelain Mosaic/Porcelain”。想知道我是否错过了什么。
  • 我已经仔细检查了它......现在它什么都做,除了它应该做的任务......我很困惑 O.o
  • @SteveK 如果您使用 LOOKUP,则被搜索的数据必须按升序排序。排序,你会得到正确的答案。
  • 我想我在这里遗漏了一些东西......因为那什么时候算字符串???现在只需将其更改为VLOOKUP(因为我很懒):P
  • 好吧,现在他们三个都可以工作了,但是应该接受哪个?! (顺便谢谢你们俩)
【解决方案2】:

在 Google 表格中使用以下公式:

=JOIN("/",filter($B$1:$B$6,ISNUMBER(SEARCH($A$1:$A$6,A8))))


在 Excel 中,Excel 在 Office 365 中引入了 TEXTJOIN() 函数,我们可以在数组公式中使用它:

=TEXTJOIN("/",TRUE,IF(ISNUMBER(SEARCH($A$1:$A$6,A8)),$B$1:$B$6,""))

作为excel中的数组,退出编辑模式时必须使用Ctrl-Shift-Enter而不是Enter。如果操作正确,Excel 会在公式周围加上{}


注意

这两种方法都会按照搜索区域的顺序而不是标准单元格中的顺序输出。

【讨论】:

  • 谢谢你,斯科特!我还收到了以下信息:=IFERROR(JOIN("/",ARRAYFORMULA(VLOOKUP(ARRAYFORMULA(SPLIT('Data Entry'!$D2,"/",TRUE)),Categories,2,FALSE))),"")您对此与您的解决方案有何看法? (我要拆分的值在“数据条目”等工作表上)
  • @SteveK 我没有意见,有很多方法可以得到答案。我确实对表格公式进行了一次调整。它更短,而不是数组公式。对它们进行全部测试,找出最适合您的。
  • 我的主要缺点是我会按照列表的顺序排列它们,而不是 A8、A9、A10 中的值。如果这很重要,那么我会使用你的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
  • 2019-09-20
  • 2012-05-07
  • 2012-08-28
  • 2015-05-10
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多