在 powerquery 中创建条件 Table.TransformColumnType

Create conditional Table.TransformColumnType in powerquery

我正在尝试将列转换为数字。如果 TransformColumnTypes 导致错误,我想保留它的文本。像这样:

#"Changed Type" = try  Table.TransformColumnTypes(CombineTables,List.Transform(sTranCol, each {_, type number})), otherwise  Table.TransformColumnTypes(CombineTables,List.Transform(sTranCol, each {_, type number})),

显然这行不通。 sTranCol 是要转换为数字的列列表。它是动态创建的,不是静态的。我不在乎它是否会在单元格中引入错误,但单元格中的错误转置会导致查询中止。

我见过的用于检测列数据类型的 M 代码方法包括对数据进行采样和确定类型。这看起来很乱。

但也许另一种方法是将列键入为数字,然后将错误值替换为在转置时不会导致问题的值。

这里是一些用 null 替换错误的示例代码,但您可以用任何 null 或数字替换:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WSlTSUTJUitWJBpI6SsZglhGQZQ5mVQBZiWCWKZCVBGaZA1kVEB0ghYYmSrGxAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Column1 = _t, Column2 = _t]),
     #"Changed Type" = Table.TransformColumnTypes(Source, 
        List.Transform(Table.ColumnNames(Source), each {_,type nullable number})),
    
    nullList = List.Transform(Table.ColumnNames(#"Changed Type"), each {_, null}),
    #"Replaced Errors" = Table.ReplaceErrorValues(#"Changed Type", nullList)
in
    #"Replaced Errors"

来源

已更改类型

替换错误

编辑:添加 M 代码以根据是否所有数字设置列类型

let
    Source = Excel.CurrentWorkbook(){[Name="Table37"]}[Content],

//check data type
//if all numbers set to number, else any

colTypes = List.Accumulate(Table.ColumnNames(Source),
    {},
    (state,current)=> List.Combine({state,
    if List.IsEmpty(
            List.RemoveMatchingItems(
                List.Transform(Table.Column(Source,current), each Value.Type(_)), 
                {type number})) 
    then {{current, type number}} 
    else {{current, type any}}})),

    #"Changed Type" = Table.TransformColumnTypes(Source,colTypes)

in
    #"Changed Type"

来源

已更改类型