Forum Discussion

smpa01's avatar
smpa01
Community Champion
3 years ago
Solved

Dynamically trim column values

I receive a response through API call and I want to convert anything but the first column to text and then  TRIMMED, CLEANED

The first column is always integer and it will always be there but everything else is text.

For example,

 

 

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUVIAAUcwCeMpODk5oQgEg4BSbCwA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [col1 = _t, col2 = _t, col3 = _t, col4 = _t]),
   ct = Table.TransformColumnTypes(Source,{{"col1", Int64.Type}, {"col2", type text}, {"col3", type text}}),
    #"Trimmed Text" = Table.TransformColumns(ct,{{"col2", Text.Trim, type text}, {"col3", Text.Trim, type text}, {"col4", Text.Trim, type text}}),
    #"Cleaned Text" = Table.TransformColumns(#"Trimmed Text",{{"col2", Text.Clean, type text}, {"col3", Text.Clean, type text}, {"col4", Text.Clean, type text}})
in
    #"Cleaned Text"

 

 

 

for example, this is the response today

but there can be col5, col6 ......col(n) tomorrow which needs to be treated the same way for transformation.

Is there a dynamic way to ask PQ to TRIM,CLEAN any column that is not first column/ col#1?

 

I tried this which works. Is this optimal? I want this to be super-efficient

 

 

Table.TransformColumns(ct, List.Transfrom(List.RemoveFirstN(Table.ColumnNames(ct),1), each {_,Text.Trim}))

 

Thank you in advance

 

AlexisOlson wdx223_Daniel @ImkeF @watkinnc @CNENFRNL 

 

 

  • I don't think you can do much better. Maybe sticking a buffer or two in there will help a bit?

     

    let
        Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUVIAAUcwCeMpODk5oQgEg4BSbCwA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [col1 = _t, col2 = _t, col3 = _t, col4 = _t]),
        ct = Table.TransformColumnTypes(Source,{{"col1", Int64.Type}, {"col2", type text}, {"col3", type text}}),
        ColsToTransform = List.Buffer(List.Skip(Table.ColumnNames(ct))),
        TransformDefinition = List.Buffer(List.Transform(ColsToTransform, each {_, (txt) => Text.Clean(Text.Trim(txt)), type text})),
        Result = Table.TransformColumns(ct, TransformDefinition)
    in
        Result

     

1 Reply

  • I don't think you can do much better. Maybe sticking a buffer or two in there will help a bit?

     

    let
        Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUVIAAUcwCeMpODk5oQgEg4BSbCwA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [col1 = _t, col2 = _t, col3 = _t, col4 = _t]),
        ct = Table.TransformColumnTypes(Source,{{"col1", Int64.Type}, {"col2", type text}, {"col3", type text}}),
        ColsToTransform = List.Buffer(List.Skip(Table.ColumnNames(ct))),
        TransformDefinition = List.Buffer(List.Transform(ColsToTransform, each {_, (txt) => Text.Clean(Text.Trim(txt)), type text})),
        Result = Table.TransformColumns(ct, TransformDefinition)
    in
        Result