Power Query:通过存储为文本参数的名称引用列

Power Query:通过存储为文本参数的名称引用列

我正在 Microsoft 365 的 Excel 中使用 Power Query。

这是我的源数据表(其表名是来源):

列1 Col2 Col3 Col4 姓名 替代名称
11 21 31 41 菲多
12 22 三十二 四十二 蓬松的
23 33 43 鸵鸟
14 24 四十四 长尾小鹦鹉 鲍勃
15 二十五 三十五 四十五 鳟鱼 辛迪

我定义了两个文本参数:

  • ColToKeep指定哪个要保留的列Col1Col2Col3Col4。未指定的列将被丢弃。
  • NameToKeepName指定要保留的列Alt.Name。未指定的列将被丢弃。

我的目标是开发一个 Power Query 来:

  1. ColToKeep删除除和指定的两列之外的所有列NameToKeep
  2. 过滤掉包含无效的在指定的列中ColToKeep

假设我设置ColToKeepCol3假设我设置NameToKeep替代名称,期望的结果是:

Col3 替代名称
31 菲多
三十二 蓬松的
33
三十五 辛迪

然而,实际(不正确)结果是:

Col3 替代名称
31 菲多
三十二 蓬松的
33
鲍勃
三十五 辛迪

这是我的 Power Query 的 M 语言代码:

let
    Source = Excel.CurrentWorkbook(){[Name="Source"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Col1", Int64.Type}, {"Col2", Int64.Type}, {"Col3", Int64.Type}, {"Col4", Int64.Type}, {"Name", Text.Type}, {"Alt.Name", Text.Type}}),
    #"Removed Other Columns" = Table.SelectColumns(#"Changed Type",{ColToKeep, NameToKeep}),
    // #"Filtered Rows" = Table.SelectRows(#"Removed Other Columns", each [ColToKeep] <> null and [ColToKeep] <> "")
    // #"Filtered Rows" = Table.SelectRows(#"Removed Other Columns", each ColToKeep <> null and ColToKeep <> "")
    // #"Filtered Rows" = Table.SelectRows(#"Removed Other Columns", each Table.ColumnNames(#"Removed Other Columns"){0} <> null and Table.ColumnNames(#"Removed Other Columns"){0} <> "")
in
    #"Filtered Rows"

它是#“过滤行”应用步骤出错。在上面的代码中,我展示了我在实施此应用步骤时所做的三次(注释掉的)尝试。

在第一次尝试中,我只是直接引用列名(带括号)。但是,ColToKeepNameToKeep被视为对感兴趣的列的引用,而不是包含列名的文本字符串。抛出错误,因为例如没有名为保存

第二次尝试时,我再次直接引用列名,但这次没有使用括号。这不会引发错误,但我得到了上面显示的错误输出。

在第三次尝试中,我根据列的位置来引用它们,因为直到运行时我才知道哪些列被保留。在前面的#“删除了其他列”执行应用步骤后,将剩下两列。我假设它们的位置索引为 0 和 1,但我怀疑调用执行时位置索引尚未调整Table.SelectRows,因此在过滤时我没有引用我想要的列无效的值。这不会引发错误,但会生成上面显示的错误输出。

我如何根据以下内容筛选出行无效的参数命名的列中的值ColToKeep

答案1

暂时将标题放到第一行,将列编号为 1 和 2,然后过滤掉空值,然后将第一行重新提升为标题:

let
    Source = Excel.CurrentWorkbook(){[Name="Source"]}[Content],
    #"Removed Other Columns" = Table.SelectColumns(Source,{ColToKeep, NameToKeep}),
    #"Demoted Headers" = Table.DemoteHeaders(#"Removed Other Columns"),
    #"Changed Type" = Table.TransformColumnTypes(#"Demoted Headers",{{"Column2", type text}}),
    #"Filtered Rows" = Table.SelectRows(#"Changed Type", each ([Column1] <> null)),
    #"Filtered Rows1" = Table.SelectRows(#"Filtered Rows", each [Column2] <> null),
    #"Promoted Headers" = Table.PromoteHeaders(#"Filtered Rows1", [PromoteAllScalars=true])
in
    #"Promoted Headers"

相关内容