我正在 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
指定用于过滤的列的名称无效的值。它可以取任意值列1,Col2,Col3, 或者Col4。
我的目标是开发一个 Power Query 来过滤掉存在无效的在 指定的列中FilterColumn
。
假设我设置FilterColumn
为Col3,期望的结果是:
列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", ...})
注意:
在这种方法中。
Table.SelectRows(...)
用于根据指定的条件过滤行,并Table.SelectColumns(...)
用于从过滤后的行中选择所需的列。- 将 Column1、Column2 替换为实际的列名。
这种方法将过滤行和列选择合并到一个步骤中,这样可以提高效率,并使代码更简洁。