Forum Discussion

Anonymous's avatar
Anonymous
Not applicable
4 years ago
Solved

Function uses parameter for a column

I have text in one column, which I want to replace in another column. I need to do this replacement for multiple columns so I created a custom function fxReplaceValue. Because I want to repeat this for various columns with different key words, I created a parameter for the column, e.g. [Summer]

 

 

 

 

let
    Source = (qrySource) => let
        Source = qrySource,
        replaceSummer = Table.ReplaceValue(Source, each [Summer], each if Text.Contains([Value], "Summer", Comparer.OrdinalIgnoreCase) then [Value] else [Summer], Replacer.ReplaceValue,{"Summer"}),
        replaceValSummer = Table.ReplaceValue(replaceSummer, each [Value], each if Text.Contains([Summer], "Summer", Comparer.OrdinalIgnoreCase) then "" else [Value], Replacer.ReplaceValue,{"Value"})
    in
        replaceValSummer
in
    Source

 

 

 

 

What is the correct syntax to reference the desired column as a parameter?

 

 

 

 

let
    Source = (qrySource, colReplacement) => let
        Source = qrySource,
        replaceSummer = Table.ReplaceValue(Source, each colReplacement, each if Text.Contains([Value], "Summer", Comparer.OrdinalIgnoreCase) then [Value] else colReplacement, Replacer.ReplaceValue,{colReplacement}),
        replaceValSummer = Table.ReplaceValue(replaceSummer, each [Value], each if Text.Contains(colReplacement, "Summer", Comparer.OrdinalIgnoreCase) then "" else [Value], Replacer.ReplaceValue,{"Value"})
    in
        replaceValSummer
in
    Source

 

 

 

Thank you for any advice!

  • let
        Source = (qrySource,ColumnToCheck as text,Condition as text,ColumnToBeReplaced as text) => let
            Source = qrySource,
            replaceSummer = Table.ReplaceValue(Source, each Record.Field(_,ColumnToBeReplaced), each if Text.Contains(Record.Field(_,ColumnToCheck), Condition, Comparer.OrdinalIgnoreCase) then Record.Field(_,ColumnToCheck) else Record.Field(_,ColumnToBeReplaced), Replacer.ReplaceValue,{ColumnToBeRelaced}),
            replaceValSummer = Table.ReplaceValue(replaceSummer, each Record.Field(_,ColumnToCheck), each if Text.Contains(Record.Field(_,ColumnToBeReplaced), Condition, Comparer.OrdinalIgnoreCase) then "" else Record.Field(_,ColumnToCheck), Replacer.ReplaceValue,{ColumnToCheck})
        in
            replaceValSummer
    in
        Source

    regardless of efficiency, just amend your code.

6 Replies

  • wdx223_Daniel's avatar
    wdx223_Daniel
    Icon for Community Champion rankCommunity Champion
    let
        Source = (qrySource,ColumnToCheck as text,Condition as text,ColumnToBeReplaced as text) => let
            Source = qrySource,
            replaceSummer = Table.ReplaceValue(Source, each Record.Field(_,ColumnToBeReplaced), each if Text.Contains(Record.Field(_,ColumnToCheck), Condition, Comparer.OrdinalIgnoreCase) then Record.Field(_,ColumnToCheck) else Record.Field(_,ColumnToBeReplaced), Replacer.ReplaceValue,{ColumnToBeRelaced}),
            replaceValSummer = Table.ReplaceValue(replaceSummer, each Record.Field(_,ColumnToCheck), each if Text.Contains(Record.Field(_,ColumnToBeReplaced), Condition, Comparer.OrdinalIgnoreCase) then "" else Record.Field(_,ColumnToCheck), Replacer.ReplaceValue,{ColumnToCheck})
        in
            replaceValSummer
    in
        Source

    regardless of efficiency, just amend your code.

    • Anonymous's avatar
      Anonymous
      Not applicable

      wdx223_Danielthank you so much for the solution! 😁

       

      It works perfectly!

  • Anonymous's avatar
    Anonymous
    Not applicable

    I think I solved my own question by just changing the entries in the formula.

    = fxReplaceValue(_NotesMech, "Summer")
    • jbwtp's avatar
      jbwtp
      Icon for Memorable Member rankMemorable Member

      Hi Anonymous,

       

      Intersting, it should not really as you pass the parameter as text and intend to use it as column, unless relevant rows in the [Summer] column = "Summer". A correct way to address (if necessary) a column from text would be something like Record.FieldOrDefault(_, colReplacement), where you refer colReplacement as a column.

       

      Cheers,

      John

       

      • Anonymous's avatar
        Anonymous
        Not applicable

        Hi jbwtp , yes this formula worked, but did not return the desired results. I will try Daniels solution instead.

  • Anonymous's avatar
    Anonymous
    Not applicable

    I changed the function to append the [ColumnToBeReplaced] with the contents from [ColumnToCheck] if the [ColumnToBeReplaced] already has text.

     

     

    let
        Source = (qrySource, ColumnToCheck as text, Condition as text, ColumnToBeReplaced as text) => let
    Source = qrySource,
    
       replaceColValue = Table.ReplaceValue(Source, each Record.Field(_,ColumnToBeReplaced), 
          each if Text.Contains(Record.Field(_,ColumnToCheck), Condition, Comparer.OrdinalIgnoreCase) then 						
          (if Record.Field(_,ColumnToBeReplaced)="" then Record.Field(_,ColumnToCheck) 
              else
              Record.Field(_,ColumnToBeReplaced) & " " & Record.Field(_,ColumnToCheck))     
          else
          Record.Field(_,ColumnToBeReplaced), Replacer.ReplaceValue,{ColumnToBeReplaced}),
    
       eraseValue = Table.ReplaceValue(replaceColValue, each Record.Field(_,ColumnToCheck),   
          each if Text.Contains(Record.Field(_,ColumnToBeReplaced), Condition, Comparer.OrdinalIgnoreCase) then "" 
          else 
          Record.Field(_,ColumnToCheck), Replacer.ReplaceValue,{ColumnToCheck})
        in
          eraseValue
    in
        Source