Power Collection List.RemoveNulls on Column Collection

时间:2018-03-19 13:07:19

标签: excel powerquery m

我在Excel工作簿中有这样的表。此表引入Power Query(链接到图像:Table shown in Query Window)。

tblTest:
+------+------+------+------+
| Col1 | Col2 | Col3 | Col4 |
+------+------+------+------+
| 1    | 2    | null | null |
| null | null | 1    | null |
| null | 3    | null | null |
| null | null | null | 4    |
| 2    | 5    | null | null |
+------+------+------+------+

在Power Query中,我通过删除每列中的空值来创建一个新表:

let
    Source = Excel.CurrentWorkbook(){[Name="tblTest"]}[Content],    
    NewTable = Table.FromColumns({
    List.RemoveNulls(Source[Col1]),
    List.RemoveNulls(Source[Col2]),
    List.RemoveNulls(Source[Col3]),
    List.RemoveNulls(Source[Col4])
    },Table.ColumnNames(Source))
in
    NewTable

来自Power Query(NewTable)的输出:

NewTable:
+------+------+------+------+
| Col1 | Col2 | Col3 | Col4 |
+------+------+------+------+
| 1    |    2 | 1    | 4    |
| 2    |    3 | null | null |
| null |    5 | null | null |
+------+------+------+------+

NewTable是我的预期输出。

我的问题是输入表中存在未知数量的列(tblTest)。我需要一些M语言代码,它将遍历输入表中的所有列,无论多少列,并删除每列中的空值,最终导致NewTable。

根据我的理解,实际的循环(比如for循环)并不是M中真正做得太多的东西,所以我猜想有某种收集方法可以做到这一点一气呵成。我只是因为我的生活无法弄清楚可能是什么。

我希望代码看起来像这样:

    let
    Source = Excel.CurrentWorkbook(){[Name="tblTest"]}[Content],
    lstColumns = Table.ColumnNames(Source),    
    NewTable = Table.FromColumns(each List.RemoveNulls(each lstColumns),lstColumns)
in
    NewTable

上面的代码不起作用并导致以下错误:

Expression.Error: We cannot convert a value of type Function to type List.

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:1)

我认为你想要的语法是这样的:

ToCols = Table.ToColumns(Source),
NewTable = Table.FromColumns(List.Transform(ToCols, each List.RemoveNulls(_)))