Power Query在每列上应用函数

问题描述 投票:3回答:1

我正在尝试编写一个查询,它接受一个表并将表中的每个数字乘以100.我已经接近了,但是我无法正确地将它应用到每一列。下面是我到目前为止的代码。从ReplaceTable开始的行是我为一列工作的行,下面的行是我尝试将其用于其他列。我目前正处理一个小子集,但实际数据可能有~100列,所以我不想手工完成。如果有更好的方法来完成这项任务,请告诉我。我是Power Query的新手,所以如果能够解释我的错误/解决方案,那么我可以学习。谢谢!

let
    Source = Excel.CurrentWorkbook(){[Name="Data"]}[Content],
    //Organization will always be of type text.  The others will be should be numbers, unless user error
    #"Changed Type" = Table.TransformColumnTypes(Source, {{"Organization", type text}, {"A", Int64.Type}, {"B", Int64.Type}, {"C", Int64.Type}}),
   //function to replace all values in all columns with multiplied values
   MultiplyReplace = (DataTable as table, DataTableColumns as list) =>
     let
        Counter = Table.ColumnCount(DataTable),
        ReplaceCol = (DataTableTemp, i) =>
            let
                colName = {DataTableColumns{i}},
                col = Table.Column(DataTableTemp, colName),
                //LINE THAT WORKS- want this functionality for ALL columns
                ReplaceTable = Table.ReplaceValue(DataTableTemp, each[A], each if [A] is number then [A]*100 else [A], Replacer.ReplaceValue, colName)
                //ReplaceTable = Table.ReplaceValue(DataTableTemp, each col, each if col is number then col*100 else col, Replace.ReplaceValue, colName)
            in
                if i = Counter-1 then ReplaceTable else @ReplaceCol(ReplaceTable, i+1)
     in
        ReplaceCol(DataTable, 0),
    allColumns = Table.ColumnNames(#"Changed Type"),
    #"Multiplied Numerics" = MultiplyReplace(#"Changed Type", allColumns)
    //#"Restored Type" = Value.ReplaceTypes(#"Multiplied Numerics", #"Changed Type")
in
    #"Multiplied Numerics"
excel powerbi powerquery excel-2016 m
1个回答
1
投票

该问题涉及函数和变量的范围。

使用硬编码的列名称(例如[A]),代码正在理解实际意味着_[A]的简写。在Table.ReplaceValue函数中,_引用当前记录或行。但是,col变量引用整个表列。在replacer功能中使用时,会导致错误。 (不幸的是(?),替换器函数中的错误只是被忽略而没有错误消息,因此很难跟踪问题。)

在更正的代码中,我摆脱了col变量,因为它是在错误的范围级别确定的。我将colName更改为文本而不是列表,然后将Record.Field函数与_Table.ReplaceValue函数中的当前记录)和文本值colName一起使用Table.ReplaceValue函数本身提取所需的计算记录。

更正代码


let
    Source = Excel.CurrentWorkbook(){[Name="Data"]}[Content],
    //Organization will always be of type text.  The others will be should be numbers, unless user error
    #"Changed Type" = Table.TransformColumnTypes(Source, {{"Organization", type text}, {"A", Int64.Type}, {"B", Int64.Type}, {"C", Int64.Type}}),
   //function to replace all values in all columns with multiplied values
   MultiplyReplace = (DataTable as table, DataTableColumns as list) =>
     let
        Counter = Table.ColumnCount(DataTable),
        ReplaceCol = (DataTableTemp, i) =>
            let
                colName = DataTableColumns{i},
                //LINE THAT WORKS- want this functionality for ALL columns
                ReplaceTable = Table.ReplaceValue(DataTableTemp,each Record.Field(_, colName), each if Record.Field(_, colName) is number then Record.Field(_, colName)*100 else Record.Field(_, colName),Replacer.ReplaceValue,{colName})
                //ReplaceTable = Table.ReplaceValue(DataTableTemp, each col, each if col is number then col*100 else col, Replace.ReplaceValue, colName)
            in
                if i = Counter-1 then ReplaceTable else @ReplaceCol(ReplaceTable, i+1)
     in
        ReplaceCol(DataTable, 0),
    allColumns = Table.ColumnNames(#"Changed Type"),
    #"Multiplied Numerics" = MultiplyReplace(#"Changed Type", allColumns)
    //#"Restored Type" = Value.ReplaceTypes(#"Multiplied Numerics", #"Changed Type")
in
    #"Multiplied Numerics"
© www.soinside.com 2019 - 2024. All rights reserved.