Forum Discussion

Anonymous's avatar
Anonymous
Not applicable
3 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
    Community 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
      Memorable 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