Excel 在每列上应用函数的Power Query
我正在尝试编写一个查询,它接受一个表,并将表中的每个数字乘以100。我已经接近了,但是我很难将它正确地应用到每一列。下面是我到目前为止的代码。以ReplaceTable开头的行是我为一个列工作的行,下面的行是我试图让它为其他列工作的行。我目前正在处理一个小的子集,但是实际数据可能有大约100列,所以我不想手工完成。如果有更好的方法来完成这项任务,请让我知道。我不熟悉Power Query,因此如果可以,请解释我的错误/解决方案,以便我可以学习。谢谢Excel 在每列上应用函数的Power Query,excel,powerbi,powerquery,excel-2016,m,Excel,Powerbi,Powerquery,Excel 2016,M,我正在尝试编写一个查询,它接受一个表,并将表中的每个数字乘以100。我已经接近了,但是我很难将它正确地应用到每一列。下面是我到目前为止的代码。以ReplaceTable开头的行是我为一个列工作的行,下面的行是我试图让它为其他列工作的行。我目前正在处理一个小的子集,但是实际数据可能有大约100列,所以我不想手工完成。如果有更好的方法来完成这项任务,请让我知道。我不熟悉Power Query,因此如果可以,请解释我的错误/解决方案,以便我可以学习。谢谢 let Source = Excel.
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"
这个问题涉及函数和变量的范围 对于硬编码的列名(如[a]),代码理解为实际意思是
\uUA]
。在Table.ReplaceValue
函数中,引用当前记录或行。但是,col
变量引用的是整个表列。在replacer函数中使用时,会导致错误。(不幸的是(?),replacer函数中的错误被忽略,没有错误消息,因此问题很难跟踪。)
在更正的代码中,我去掉了col
变量,因为它被确定在错误的范围级别。我将colName
更改为文本而不是列表,然后将Record.Field
函数与\uu
一起使用(表中的当前记录.ReplaceValue
函数)以及文本值colName
,以提取所需的记录,用于使用Table.ReplaceValue
函数本身进行计算
已更正的代码
该代码适用于1列(示例中的A列)。但是,我需要将其应用于表中的每一列。我有一行评论出来,这是我试图这样做。因此,在运行代码的最后,A、B和C列都应该乘以100。非常好,非常感谢!我也非常感谢你的解释。帮助清理了Record.Field函数中发生的事情。@Zoopzoop不客气。
\uuu
的棘手之处在于,它的含义可能会根据所使用的功能而变化。我有一些表级函数,其中\u
表示特定字段而不是记录。
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"