【问题标题】:TextJoin Matrix文本连接矩阵
【发布时间】:2021-06-07 18:41:02
【问题描述】:

你好 stackoverflow 社区!这是我在这里的第一篇文章,所以要温柔!

我一直在努力尝试自动化命名系统,以便在我工作的公司创建新产品。我们经常推出新的 SKU,因此我想让新商品尽可能轻松地与我们当前的系统配合使用。

这是我想要完成的: 我们有不同的产品类型、尺寸、口味和比例。我希望能够根据输入到表格中的信息生成我们制造的所有不同产品的列表。 例如,如果我们想添加一个浴缸炸弹,我们可能有一个小一个和一个大一个,比如说一个 50 克和一个 150 克。我们可能还会有几种不同的气味,例如一种带有薰衣草的气味,一种带有没药的气味。因此,根据输入的信息如下:

Name Scent 1 Scent 2 Size 1 Size 2
Bath Bomb lavender Myrrh 50g 150g

我想生成一个这样的列表:

沐浴炸弹,薰衣草,50g

沐浴炸弹,薰衣草,150g

沐浴炸弹,没药,50g

沐浴炸弹,没药,150g

(不必与上面显示的顺序相同)

我遇到的问题如下: 我们的一些产品可能有 2 种尺寸,而其他产品可能有更多,口味/比例相同。 因此,我的桌子上有很多空白点(因为尺寸 2 可能不会填充在只有一​​种尺寸的物品上) 我目前正在尝试基于一行创建每个可能组合的矩阵,但我不确定如何在不花费数小时设置 TextJoin 函数的情况下使用 ISBlank 摆脱任何试图引用空单元格的行。

任何帮助将不胜感激!

更新:为了更好地展示我正在尝试做的事情,下面是一张图片,它显示了一个表格示例,其中包含我在其下方手动创建的列表:

Example Table and List

【问题讨论】:

  • 只包括范围内的空单元格并将Ignore_Empty参数设置为TRUE?
  • 嗨,克里斯,感谢您的回复!我的问题不是摆脱空白,而是根据输入的所有标准生成列表(例如,每种尺寸和气味一个)
  • 另外,我希望尽可能自动化。如果我必须为每个条目手动选择适当的列,这有点违背了目的。

标签: excel excel-formula textjoin


【解决方案1】:

如果我已经很好地理解了目标,那么您正在尝试进行嵌套的 unpivot(标准化或融化)。您正在嵌套两个属性:Scents 和 Sizes,但听起来可能还有更多属性 - 如果是这样,此方法可以概括为以下逻辑:

您正在按气味对尺寸进行反透视,然后按名称对结果进行反透视除了气味可以为空白我们会更清楚一点。

如果这是输入数据:

那么这将是预期的输出结果删除了空白尺寸

请注意,Rust Remover 没有气味/口味,但包括在内, 而根据上述规则删除空白大小的行。

在这种情况下,我看到了两种方法(不包括 VBA):

  • PowerQuery - 需要 Excel for Windows 2010+
  • 动态数组公式 - Windows 或 Mac 需要 Excel 2019 或 365

由于 PowerQuery 非常简单,我将首先提出该建议。如果它对您不起作用,那么动态数组方法可能会很有趣,如果您有正确的 Excel 版本,但构建和测试需要更多时间(在我这边)。

电源查询方法

这可能看起来很吓人,但它需要的时间很少,只是很多 的点击。 5 分钟 - 最高

首先,将上面的表格转换为 Excel 表格 - 您可以单击其中的任意位置并按 CTRL t。它会询问您的表格是否有标题 - 是的,有。

现在转到表格设计标签,您可以在左侧重命名表格。我将其命名为 prodTable

现在转到数据标签并点击From Range/Table

这将打开 Power Query 编辑器,应该如下所示:

我只是想把 PowerQuery M 语言脚本贴在这里,让你把它放到你的机器上,但是如果你的表与我的模型不匹配,它就会失败,所以我们需要显示步骤。

1) Unpivot Scents

按住 CTRL 并选择气味列,然后在 转换选项卡中选择 Unpivot Columns

双击该列上的值标题并将其重命名为“气味”。右键单击“属性”列并将其删除。

2) 反透视尺寸

现在对尺寸重复这些步骤。按住 CTRL 并选择大小列,然后在 转换选项卡中选择 Unpivot Columns

双击该列上的值标题并将其重命名为“尺寸”。右键单击“属性”列并将其删除。

此时,你已经有了你所描述的,

但是你说你想要一个文本连接的名字,所以让我们在这里添加:

3) 创建合并名称

按住 CTRL 并按照您希望它们出现在文本连接中的顺序选择三列。然后在添加列标签中选择合并列

它会询问你想要什么分隔符——我只是使用了竖线字符。它还会询问您要为该列命名什么 - 我选择了 SKU 名称。

4) 将其加载到 Excel 中

现在,您只需将其移回 Excel。转到主页标签并选择关闭并加载到

然后告诉它您要将其加载到新工作表中 - 这是最简单的。

现在您将拥有一个名为 prodTable 的新工作表,其中将包含您转换后的产品表。这都是一次性的设置。从现在开始,当用户创建新组合时,您只需要通过右键单击它并刷新来刷新表 - PowerQuery 将执行您刚刚创建的 M 脚本,并将根据用户的输入生成所有 SKU .

如果您有 Excel for Mac 或者您希望它基于公式,那么请在 cmets 中大喊大叫。我知道使用动态数组执行此操作的唯一方法需要 Excel 2019,因为它将严重依赖 SEQUENCE 和 LET。我已经完成了 unpivots/melts,但是嵌套的 melts 需要一些思考。

另一种方法

这是一个 M 脚本,您可以将其加载到 PQ 高级编辑器中,基本上可以在没有气味/口味但有大小的情况下为您提供所需的内容。它不能处理您想要的所有嵌套属性,不幸的是,每次添加属性时都必须重写它,但它让您了解该方法:

let
   Source = Excel.CurrentWorkbook(){[Name="prodTable"]}[Content],
   #"Changed Type" = Table.TransformColumnTypes(Source,{{"Name", type text}, {"Scent 1", type text}, {"Scent 2", type text}, {"Size 1", type text}, {"Size 2", type text}}),
   #"Replaced Value" = Table.ReplaceValue(#"Changed Type",null,"WASNULL",Replacer.ReplaceValue,{"Scent 1"}),
   #"Unpivoted Columns" = Table.UnpivotOtherColumns(#"Replaced Value", {"Name", "Size 1", "Size 2"}, "Attribute", "Value"),
   #"Renamed Columns" = Table.RenameColumns(#"Unpivoted Columns",{{"Value", "Scents"}}),
   #"Removed Columns" = Table.RemoveColumns(#"Renamed Columns",{"Attribute"}),
   #"Unpivoted Columns1" = Table.UnpivotOtherColumns(#"Removed Columns", {"Name", "Scents"}, "Attribute", "Value"),
   #"Renamed Columns1" = Table.RenameColumns(#"Unpivoted Columns1",{{"Value", "Sizes"}}),
   #"Removed Columns1" = Table.RemoveColumns(#"Renamed Columns1",{"Attribute"}),
   #"Replaced Value1" = Table.ReplaceValue(#"Removed Columns1","WASNULL",null,Replacer.ReplaceValue,{"Scents"}),
   #"Inserted Merged Column" = Table.AddColumn(#"Replaced Value1", "SKU Name", each Text.Combine({[Name], [Scents], [Sizes]}, "|"), type text)
in
    #"Inserted Merged Column"

我试图使属性动态化,但是如果不进行大量 ETL,这会变得很困难。不知何故,你的目标似乎触手可及。您生成所有可能组合的想法可能会奏效,但需要进行大量设置才能实现您想要的规则。

【讨论】:

  • 哇,这看起来不可思议!我将在接下来的几天内对此进行测试,谢谢马克!
  • 如果不是太麻烦的话,我也很想看看数组公式。我在 Microsoft 365 中使用 Excel,我的版本是 2105。我过去曾使用过数组公式,我相信这最适合我的目的。无论如何,我仍将测试 PowerQuery 方法。
  • 我已经对此进行了一些测试,如果选择的任何列包含 null,Unpivot 似乎会删除行。因此,我不相信完全按照所示完成的 PowerQuery 方法会返回我需要的所有项目。这是因为有些产品没有关联风味/气味,并且这些 SKU 被完全删除。
  • 啊——好的,这在 PQ 中很容易解决。 DA 将执行与此答案中显示的相同的操作 - 更糟糕的是,我的第一个 DA 方法不会过滤空白。为了确保我理解要求,有一条规则是如果没有香味/口味,则将香味/口味视为空白。我将在表格中添加模型数据和预期结果。你能确认这些是你想要的吗?如果是这样,那么它在 PQ 中是快速的工作。
  • OK - 所以我在顶部添加了表格。这里的区别在于 Rust Remover - 在第一个答案中,它不包括在内,而在目标解决方案中,它应该是。是对的吗?如果是这样,在 PQ 中很容易做到这一点。
猜你喜欢
  • 1970-01-01
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 2015-12-20
  • 1970-01-01
相关资源
最近更新 更多