Forum Discussion
Power Query - Table.ReplaceValue - Behavior ?
- 1 year ago
Sur les points 1 et 3
quand vous ajoutez une colonne à une table, vous ne vous demandez pas ce que veut dire le [xxxx]
exemple, si vous créez une nouvelle colonne avec les 2 derniers caractères d'une autre colonne
= Table.AddColumn(Source, "Column2", each Text.End([Column1], 2), type text)
le [Column1] désigne le texte contenu dans le champ intitulé "Column1" de votre ligne en cours
cela vous semble naturel !
vous pourriez également écrire :
= Table.AddColumn(Source, "Column2", (_) => Text.End(_[Column1], 2), type text)
ici j'ai mis un _ mais vous auriez pu mettre un x ou informer
cette syntaxe est valable
= Table.AddColumn(Source, "Column2", (informer) => Text.End(informer[Column1], 2), type text)
il est implicite que "informer" est l'enregistrement en cours (de l'étape "source")
La fonction Table.ReplaceValue est plus complexe car la fonction du 4e argument utilise les 3 arguments précédents pour elle-même. quelque soit les noms qu'on leur donne (x,y,z) ou (a,b,c) ou (informer1,informer2,informer3)
= Table.ReplaceValue(Source, Argument2, Argument3, (informer1,informer2,informer3)=>informer2, {"Column1"}ici on remplacera la column1 par le valeur du 2e argument
ce peut être du texte, un nombre, une liste... lié à la ligne en cours si on a un each...
mais également une valeur d'une autre requête
un exemple tiré par les cheveux pour bien comprendre,
let
Source = Table.FromColumns({{1..3}},{"Column1"}),
Replace = Table.ReplaceValue(Source, Source[Column1], (toto)=> Source , (a,b,c)=>a, {"Column1"})
in
Replacene changera rien à la column1, on prend la valeur du premier argument (donc la column1) et on le remet.
let
Source = Table.FromColumns({{1..3}},{"Column1"}),
Replace = Table.ReplaceValue(Source, Source[Column1], (toto)=> Source , (a,b,c)=>b, {"Column1"})
in
Replaceon n'a pas de each, on n'est donc pas dans la ligne en cours, on prendre la colonne "Column1" de la table "Source" c'est à dire la colonne elle-même (en entier !)
on aura donc une liste {1..3} dans chaque cellule.
enfin,
let
Source = Table.FromColumns({{1..3}},{"Column1"}),
Replace = Table.ReplaceValue(Source, Source[Column1], (toto)=> Source , (a,b,c)=>c, {"Column1"})
in
Replaceici la fonction renvoie c, le 3eme argument que j'ai volontairement écrit (toto)=> (toto ou _ ou each, c'est la même chose, c'est la ligne en cours
sauf que là, je ne renvoie pas un champ spécifique de la ligne avec des [ ] mais Source, donc l'étape précédente.
Dans toutes les cellules j'aurais donc la table Source avec sa seule colonne de trois valeurs, 1, 2, 3.
Quant au point 2, Power Query ne génère pas d'erreur lorsqu'il n'y a pas assez d'argument, mais les modifications ne sont pas effectuées
Si par exemple j'écris := Table.ReplaceValue(Source, each null, each null , Date.Day, {"Column1"})Date.Day est une fonction avec un seul argument, je n'ai aucune erreur, mais la fonction ne remplace rien.
= Table.ReplaceValue(Source, each null, each null , List.Accumulate, {"Column1"})pas d'erreur non plus avec List.Alternate qui demande pourtant 3 arguments. la fonction renvoie un erreur, il ne se passe rien. peut-être un bug de Power Query ?
Est-ce plus clair ?
Stéphane
Bonjour Stéphane et merci une nouvelle fois pour répondre à mes question. Je sévis sur ce site pour ne pas vous surcharger sur le sujet !!!
Vos explications sont très didactiques et claires mais beacoup de concepts me déroutent. Par exemple :
- Je ne sais pas comment les affectations se font pour les 3 variables (x,y,z) car jamais il n'y a x = #"Source", y = each [Acronyme], z = null ?
- Pourquoi est-il obligatoire de passer 3 paramètres alors que je redéfinis une fonction personnalisée donc avec sa propore définition sachant que z n'est jamais utilisé ?
J'ai essayé avec 2 paramètres , il n'a pas d'erreur mais il n'y a pas de modification ! - Comment se fait la concordance entre la ligne courante et [Acronyme] passé en paramètre ?
----------------------------------------------------------------------------------------------------
Many concepts confuse me. Like what:
- I don't know how the assignments are made for the 3 variables (x,y,z) because there is never x = #"Source", y = each [Acronym], z = null?
- Why is it mandatory to pass 3 parameters when I redefine a custom function with its own definition knowing that z is never used?
I tried with 2 settings, it has no error but there is no modification! - How is the concordance between the current line and [Acronym] passed as a parameter?
Sur les points 1 et 3
quand vous ajoutez une colonne à une table, vous ne vous demandez pas ce que veut dire le [xxxx]
exemple, si vous créez une nouvelle colonne avec les 2 derniers caractères d'une autre colonne
= Table.AddColumn(Source, "Column2", each Text.End([Column1], 2), type text)
le [Column1] désigne le texte contenu dans le champ intitulé "Column1" de votre ligne en cours
cela vous semble naturel !
vous pourriez également écrire :
= Table.AddColumn(Source, "Column2", (_) => Text.End(_[Column1], 2), type text)
ici j'ai mis un _ mais vous auriez pu mettre un x ou informer
cette syntaxe est valable
= Table.AddColumn(Source, "Column2", (informer) => Text.End(informer[Column1], 2), type text)
il est implicite que "informer" est l'enregistrement en cours (de l'étape "source")
La fonction Table.ReplaceValue est plus complexe car la fonction du 4e argument utilise les 3 arguments précédents pour elle-même. quelque soit les noms qu'on leur donne (x,y,z) ou (a,b,c) ou (informer1,informer2,informer3)
= Table.ReplaceValue(Source, Argument2, Argument3, (informer1,informer2,informer3)=>informer2, {"Column1"}
ici on remplacera la column1 par le valeur du 2e argument
ce peut être du texte, un nombre, une liste... lié à la ligne en cours si on a un each...
mais également une valeur d'une autre requête
un exemple tiré par les cheveux pour bien comprendre,
let
Source = Table.FromColumns({{1..3}},{"Column1"}),
Replace = Table.ReplaceValue(Source, Source[Column1], (toto)=> Source , (a,b,c)=>a, {"Column1"})
in
Replace
ne changera rien à la column1, on prend la valeur du premier argument (donc la column1) et on le remet.
let
Source = Table.FromColumns({{1..3}},{"Column1"}),
Replace = Table.ReplaceValue(Source, Source[Column1], (toto)=> Source , (a,b,c)=>b, {"Column1"})
in
Replace
on n'a pas de each, on n'est donc pas dans la ligne en cours, on prendre la colonne "Column1" de la table "Source" c'est à dire la colonne elle-même (en entier !)
on aura donc une liste {1..3} dans chaque cellule.
enfin,
let
Source = Table.FromColumns({{1..3}},{"Column1"}),
Replace = Table.ReplaceValue(Source, Source[Column1], (toto)=> Source , (a,b,c)=>c, {"Column1"})
in
Replace
ici la fonction renvoie c, le 3eme argument que j'ai volontairement écrit (toto)=> (toto ou _ ou each, c'est la même chose, c'est la ligne en cours
sauf que là, je ne renvoie pas un champ spécifique de la ligne avec des [ ] mais Source, donc l'étape précédente.
Dans toutes les cellules j'aurais donc la table Source avec sa seule colonne de trois valeurs, 1, 2, 3.
Quant au point 2, Power Query ne génère pas d'erreur lorsqu'il n'y a pas assez d'argument, mais les modifications ne sont pas effectuées
Si par exemple j'écris :
= Table.ReplaceValue(Source, each null, each null , Date.Day, {"Column1"})
Date.Day est une fonction avec un seul argument, je n'ai aucune erreur, mais la fonction ne remplace rien.
= Table.ReplaceValue(Source, each null, each null , List.Accumulate, {"Column1"})
pas d'erreur non plus avec List.Alternate qui demande pourtant 3 arguments. la fonction renvoie un erreur, il ne se passe rien. peut-être un bug de Power Query ?
Est-ce plus clair ?
Stéphane
- ronrsnfld1 year ago
Super User
It might help to look closely at Example 4 in the MS documentation for Table.ReplaceValue
And what might be confusing is that, although Table.ReplaceValue passes 3 values to the fourth argument, they are not passed "in order".
Rather, if we use (x,y,z)
x refers to fifth argument the list of columns to act on y refers to the second argument nominally the old text z refers to the third argument nominally the replacement text - ronrsnfld1 year ago
Super User
The fact that three parameters are passed to the 4th argument is implied by Example 4, and also by the Replacer function which has three non-optional parameters.
"What is assigned to them" can also be seen in the fourth example, where it is clear that the first parameter corresponds to the 5th argument, the second to the second, and the third to the third argument of the Table.ReplaceValue function. (Sometimes it is not so clear).
It is not laid out in more detail because it is part of the architecture of how the M language works, and you'd have to delve deeply into the architecture and specifications to better understand that. Power Query M formula language
- informer1 year ago
Helper I
Stéphane,
Le voile de l'incompréhension se lève doucement grâce à vous et à toute la communauté toutefois je trouve que la documentation sur M qui est disponible sur MSN et internet en général est parcellaire, lacunaire et peu explicite !Par exemple pour Table.ReplaceValue, la documentation se résume à une définition
Table.ReplaceValue( table as table, oldValue as any, newValue as any, replacer as function, columnsToSearch as list, ) as tableEt comment deduire de
replacer functionQu'une fonction personnalisée doit obligatoirement passer 3 paramètres alors que si on appelle les 2 fonctions ci-dessous, aucun paramètre n'est demandé ?
Replacer.ReplaceValue et Replacer.ReplaceText
Exemple
= Table.ReplaceValue(#table( {"text", "Col1", "Col2"}, { {"azeurty",1, 2}, {"azeurty",3, 4} } ), "ur", "", Replacer.ReplaceText, {"text"})output
text Col1 Col2
azety 1 2
azety 3 4Et comment déduire que si une fonction personnelle est implémentée, en plus de devoir passer 3 paramètres ( x,y,z) => ,
x = Source
y = oldValue
z = NewValue
Sauf s'il existe une documentation qui l'explique mais je n'ai jamais reussi à accéder à cette information. Ou alors j'ai vraiment raté plus qu'une marche !!!
- lbendlin1 year ago
Super User
Ah, so you haven't played with List.Accumulate yet? or with this one? Table.Group: Exploring the 5th element in Power BI and Power Query –
- informer1 year ago
Helper I
Hi ronrsnfld,
Thanks for yoour help
For each step forward, I take at least 2 steps back
Take a look at the page Learn microsoft - powerquery M - Table.Replacevalue he definition of the function isTable.ReplaceValue(table as table, oldValue as any, newValue as any, replacer as function, columnsToSearch as list) as tableI modifyed the 4th example as below
= Table.ReplaceValue( Table.FromRecords({ [Name = "Cindy", Country = "US", test = "zozo"], [Name = "Bob", Country = "CA", test = "zaza"] }), each [test] = "zaza", null, (row, test, z) => if test then "?" else row , {"Name", "Country"} )And my cmonclusions are :
- Talk about OldValue is for me not relevant because in my example OldValueits a condition on a 3rd column . Same for or NewValue because , I can assign the condition also to a or NewValue
- Nowhere it's explained that if a custom function REPLACER is declared, why 3 paramters are mandatory and what is assigned to them ?
- The fecth on each row is not clearly explained
- informer1 year ago
Helper I
Thanks Rirsnfld for
- confirming that it's no so clear and that it is necessary to decipher the examples that only very partially replace an explanation of the principles
- The link Power Query M formula language to delve deeply into the architecture and specifications to better understand that.