Forum Discussion

Anonymous's avatar
Anonymous
Not applicable
7 years ago
Solved

Table Transformations for Dynamic Columns

Hi,

 

Input:

I have a table with changing #'s of columns.

 

Process:

I need to take the first two characters of these columns. So I need PQ to dynamically identify which columns to take the first two characters from depending on their header name. For instance, something like for all columns that start with ABCD, take the first two characters of every row.

 

Problem:

I know how to make a list of the headers that start with ABCD. But I don't know how to pass that list to a TableTransformColumns_Text.Start(ColumnList, 2). Where columnlist is Power BI only seems to accept 1 column value at a time, and if more are desired the code needs to be repeated with the new column name which of course won't work dynamically.

 

Any ideas on how to pass dynamic column amounts through a table transformation text.start? Thanks!

 

For ex: The below code works with removing columns dynamically. Something like this but with Text.Start

    Source = Table.FromRows({{"New York", 23, 51, 732}, {"Chicago", 25, 421, 23}, {"Los Angeles", 632, 22, 423}}, {"City", "Value 1", "Value 2", "Column 3"}),
    ColumnsToRemove = List.Select(Table.ColumnNames(Source), each Text.StartsWith(_, "V")),
    RemovedColumns = Table.RemoveColumns(Source, ColumnsToRemove)

 

Thanks,

Buri 

  • HI Anonymous

     

    If I understand the problem correctly

     

    Suppose in your above sample, you want to transform the Columns starting with V

    for example multiply all values by 10 or divide them by 10 you can use something like this

    let
    Source = Table.FromRows({{"New York", 23, 51, 732}, {"Chicago", 25, 421, 23}, {"Los Angeles", 632, 22, 423}}, {"City", "Value 1", "Value 2", "Column 3"}),
    ColumnsToTransform= List.Select(Table.ColumnNames(Source), each Text.StartsWith(_, "V")),
    ActionToPerform=List.Repeat({each _ *10},List.Count(ColumnsToTransform)),
    Transformed=Table.TransformColumns(Source,List.Zip({ColumnsToTransform,ActionToPerform}))
    in
     Transformed

     

     

  • ImkeF's avatar
    ImkeF
    7 years ago

    Please try this function:

     

    (InputTable as table, ListOfColNames, TransformFunction as function) =>
    let
        TransformFunctionList = List.Transform(ListOfColNames, (x) => {x, TransformFunction}),
        Transform = Table.TransformColumns(InputTable, TransformFunctionList)
    in
        Transform

    Name it "fnTransformMany" and call it like so:

     

    let
        Source = Table.FromRows({{"New York", "23", "51", "732"}, {"Chicago", "25", "421", "23"}, {"Los Angeles", "632", "22", "423"}}, {"City", "Value 1", "Value 2", "Column 3"}),
        ColumnsToRemove = List.Select(Table.ColumnNames(Source), each Text.StartsWith(_, "V")),
        Result = fnTransformMany(Source, ColumnsToRemove, each Text.Start(_, 2))
    in
        Result

     

4 Replies

    • ImkeF's avatar
      ImkeF
      Community Champion

      Please try this function:

       

      (InputTable as table, ListOfColNames, TransformFunction as function) =>
      let
          TransformFunctionList = List.Transform(ListOfColNames, (x) => {x, TransformFunction}),
          Transform = Table.TransformColumns(InputTable, TransformFunctionList)
      in
          Transform

      Name it "fnTransformMany" and call it like so:

       

      let
          Source = Table.FromRows({{"New York", "23", "51", "732"}, {"Chicago", "25", "421", "23"}, {"Los Angeles", "632", "22", "423"}}, {"City", "Value 1", "Value 2", "Column 3"}),
          ColumnsToRemove = List.Select(Table.ColumnNames(Source), each Text.StartsWith(_, "V")),
          Result = fnTransformMany(Source, ColumnsToRemove, each Text.Start(_, 2))
      in
          Result

       

    • Zubair_Muhammad's avatar
      Zubair_Muhammad
      Community Champion

      HI Anonymous

       

      If I understand the problem correctly

       

      Suppose in your above sample, you want to transform the Columns starting with V

      for example multiply all values by 10 or divide them by 10 you can use something like this

      let
      Source = Table.FromRows({{"New York", 23, 51, 732}, {"Chicago", 25, 421, 23}, {"Los Angeles", 632, 22, 423}}, {"City", "Value 1", "Value 2", "Column 3"}),
      ColumnsToTransform= List.Select(Table.ColumnNames(Source), each Text.StartsWith(_, "V")),
      ActionToPerform=List.Repeat({each _ *10},List.Count(ColumnsToTransform)),
      Transformed=Table.TransformColumns(Source,List.Zip({ColumnsToTransform,ActionToPerform}))
      in
       Transformed