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

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

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

我即将提出的问题与我最近提出的问题非常相似,并且已经给出了一个优雅的答案。该问题如下: Power Query:通过存储为文本参数的名称引用列

在上面链接的问题中,我需要根据某一列的空值来过滤行,该列的位置是恒定的(始终是第一列),但其名称很难使用,因为它存储在文本参数中。答案是降级标题(从而为它们提供可预测的名称),根据以下空值进行过滤列 1,并提升标题(以恢复其原始名称)。保存列名称的文本参数最终没有发挥作用。

在当前问题中,我再次需要根据名称存储在文本参数中的列的空值来过滤行,但这次,它并不总是第一列。它可能是第一列、第二列、第三列或第四列。所以这一次,我确实必须使用指定列名的参数。

我将再次提出我原来的问题,并进行修改以反映这一新要求。

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

列1 Col2 Col3 Col4 姓名
11 21 31 41
12 22 三十二 四十二
23 33 43 鸵鸟
14 24 四十四 长尾小鹦鹉
15 二十五 三十五 四十五 鳟鱼

我定义了一个文本参数:

  • FilterColumn指定用于过滤的列的名称无效的值。它可以取任意值列1Col2Col3, 或者Col4

我的目标是开发一个 Power Query 来过滤掉存在无效的在 指定的列中FilterColumn

假设我设置FilterColumnCol3,期望的结果是:

列1 Col2 Col3 Col4 姓名
11 21 31 41
12 22 三十二 四十二
23 33 43 鸵鸟
15 二十五 三十五 四十五 鳟鱼

这是我的 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}}),
    // #"Filtered Rows" = Table.SelectRows(#"Changed Type", each [FilterColumn] <> null and [FilterColumn] <> "")
    // #"Filtered Rows" = Table.SelectRows(#"Changed Type", each FilterColumn <> null and FilterColumn <> "")
in
    #"Filtered Rows"

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

在第一次尝试中,我只是直接引用列名(带括号)。但是,FilterColumn被视为感兴趣的列的名称,而不是作为文本参数保存列名。由于没有名为的列,因此会引发错误筛选列Expression.Error: The field 'FilterColumn' of the record wasn't found.

在第二次尝试中,我再次直接引用列名,但这次没有使用括号。这不会引发错误,但没有行被过滤掉。输出与输入没有变化。

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

答案1

您需要将参数作为文本字符串传递,因此请尝试:

#"Filtered Rows" = Table.SelectRows(#"Changed Type", (r)=>Record.Field(r,FilterColumn)<>null)

或者

#"Filtered Rows" = Table.SelectRows(#"Changed Type", 
        each Record.Field(_,FilterColumn) <> null 
        and Record.Field(_,FilterColumn) <> "")

答案2

您也可以使用这个,,,

#"Filtered Rows" = Table.SelectColumns(Table.SelectRows(#"Changed Type", each [FilterColumn] <> null and [FilterColumn] <> ""), {"Column1", "Column2", ...})

注意:

在这种方法中。

  1. Table.SelectRows(...)用于根据指定的条件过滤行,并Table.SelectColumns(...)用于从过滤后的行中选择所需的列。
  2. 将 Column1、Column2 替换为实际的列名。

这种方法将过滤行和列选择合并到一个步骤中,这样可以提高效率,并使代码更简洁。

相关内容