Petit challenge PowerQuery

RE

@LouReed,
Avec Microsoft 365, tu peux envisager d'utiliser les nouvelles fonctions !

14challengepq.xlsx (26.94 Ko)

2 pas encore dispo hors Insider : dommage c'est super

RE

L'auteur du challenge fait une suggestion brillante. Power Query est vaste......

Pas vu la solution de Chandeep : tu as le lien ?

Bonjour,
@78chris,

Le lien : Goodly (Chanddeep)

2e. post daté du 20.07.2022

Bonne journée.
Cdlt.

RE,

Merci pour vos liens

Bonjour à tous !

La réponse Chandeep Youtube (avec tutoriel sur la fonction List.Accumulate) : https://www.youtube.com/watch?v=RIo4OrPixco

Ce qui donne, en condensant :

let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
Ajt_ColDynamique =List.Accumulate(
                            List.Distinct(Text.Split(Text.Combine(Source[Hobby],", "),", ")),
                            Source,
                            (state,current)=>Table.AddColumn(state,current,each Text.Contains([Hobby],current),type logical)
                ),
ColSupp = Table.RemoveColumns(Ajt_ColDynamique,{"Hobby"})
in
ColSupp

Bonjour

Merci

Il y a du pain sur la planche avant de maîtriser List.Accumulate !

Bonjour de nouveau !

Il y a du pain sur la planche avant de maîtriser List.Accumulate !

Je confirme ! Mais cette fonction, tellement puissante, mérite cet investissement personnel.

Bonjour à tous de nouveau !

Dans la continuation de la proposition 365 de Jean-Eric, et pour le "fun", une formule unique et dynamique pour gérer l'entièreté du tableau :

=LET(
n_;Table2[Name];
h_;Table2[Hobby];
et_;DANSLIGNE(UNIQUE(SUPPRESPACE(FRACTIONNER.TEXTE(TEXTE.AVANT(TABLEAU.EN.TEXTE(h_);";";-1);;{",";";"})));;3);
etG_;ASSEMB.H("";et_);
t_;ESTNUM(CHERCHE(et_;h_)*(n_=n_));
ASSEMB.V(etG_;ASSEMB.H(n_;t_))
)

J'ai ajouté l'unicité des hobbys.

Qui a dit que la fonction LET améliorait la lisibilité ?

Re,
J'avais effectivement omis les doublons !
Bon, il va falloir penser à fournir le doliprane à LouReeD.
Power Query, Google Sheets, les nouvelles fonctions, çà fait beaucoup.

Note : Pour info., si vous n'avez pas été dans le Salon VIP, Sébastien nous a averti du décès de Steelson la semaine passée. Le forum a perdu une belle personne.

Cdlt.

Bonjour à tous de nouveau !

J'ai omis de préciser dans mon post précédent que la contribution de Jean-Eric, cerise sur le gâteau, gérait la personne sans hobby !

Bonsoir à tous,

Intéressant de voir les différentes approches et possibilités.

En attente du prochain challenge, bonne continuation à tous.

Cordialement.

Bonjour à tous,

Je me permets de proposer un petit challenge.

Les réponses en VBA sont aussi acceptées

13classeur1.xlsx (10.18 Ko)

Edit : provient de "Excel BI" via un post LinkedIn

Bonjour à tous !

Une proposition formule (unique et dynamique) ?

=MAP(
    tSource[Data];
    LAMBDA(x;
        LET(
            t; x;
            p; {48; 65; 97};
            REDUCE(
                "";
                SEQUENCE(NBCAR(t));
                LAMBDA(i; c;
                    SI(
                        EQUIVX(UNICODE(STXT(t; MAX(c - 1; 1); 1)); p; -1) <> EQUIVX(UNICODE(STXT(t; c; 1)); p; -1);
                        i & "," & STXT(t; c; 1);
                        i & STXT(t; c; 1)
                    )
                )
            )
        )
    )
)

Bonjour à tous !

Une approche Power Query :

let
    fnTransf = (ValText) =>
        let
            TTL = Text.ToList(Text.From(ValText)),
            Car = List.Transform(TTL, each if Character.ToNumber(_)>96 then 1 else if Character.ToNumber(_)>64 then 2 else 3),
            TFC = Table.FromColumns ({Car,TTL}),
            GBY = Table.Group(TFC, {"Column1"}, {{"Résultat", each Text.Combine([Column2])}},0)
        in Text.Combine(GBY[Résultat],","),
    Source = Excel.CurrentWorkbook(){[Name="tSource"]}[Content],
    Final = Table.AddColumn(Source, "Résultat", each fnTransf([Data]))
in
    Final

Bonjour

VBA

soit une sub qui met le résultat à côté du tableau

Sub Decoupe()
Dim Arr As Variant, Arr2 As Variant, Cible As Range

    With [tSource].ListObject
        Arr = .DataBodyRange
        Set Cible = .DataBodyRange.Offset(0, 2)
        Cible.ClearContents
        Arr2 = Cible

        For i = 1 To UBound(Arr)
            Txt = Arr(i, 1)
            For J = 2 To Len(Txt)
                CC = Asc(Mid(Txt, J, 1))
                CP = Asc(Mid(Txt, J - 1, 1))
                If CC >= 48 And CC <= 57 And CP >= 48 And CP <= 57 Then
                    Cas = "N"
                ElseIf CC >= 65 And CC <= 90 And CP >= 65 And CP <= 90 Then
                    Cas = "M"
                ElseIf CC >= 97 And CC <= 122 And CP >= 97 And CP <= 122 Then
                    Cas = "m"
                End If
                Arr2(i, 1) = Arr2(i, 1) & IIf(J = 2, Mid(Txt, J - 1, 1), "") & IIf(Cas = "", ", ", "") & Mid(Txt, J, 1)
                Cas = ""
            Next J
            On Error Resume Next
            Arr2(i, 1) = CLng(Arr2(i, 1))
            On Error GoTo 0
        Next i
        Cible.Value = Arr2
    End With
End Sub

soit une fonction à utiliser sur chaque ligne

Function FDecoupe(T As Range)
   If T.Count > 1 Then Exit Function
   For J = 2 To Len(T)
    CC = Asc(Mid(T, J, 1))
    CP = Asc(Mid(T, J - 1, 1))
    If CC >= 48 And CC <= 57 And CP >= 48 And CP <= 57 Then
        Cas = "N"
    ElseIf CC >= 65 And CC <= 90 And CP >= 65 And CP <= 90 Then
        Cas = "M"
    ElseIf CC >= 97 And CC <= 122 And CP >= 97 And CP <= 122 Then
        Cas = "m"
    End If
    FDecoupe = FDecoupe & IIf(J = 2, Mid(T, J - 1, 1), "") & IIf(Cas = "", ", ", "") & Mid(T, J, 1)
    On Error Resume Next
    FDecoupe = CLng(FDecoupe)
    Cas = ""
Next J
End Function

Hey,

@JFL, Choix intéressant de passer par un groupkind.local je ne l’avais pas du tout vu ainsi. Je posterai ma solution dans la journée :)

@78Chris j’ai encore un peu de pain sur la planche pour les tableaux array sur le VBA j’ai jamais passé le cap

Ma petite contribution

let   
    Source = Excel.CurrentWorkbook(){[Name="tSource"]}[Content],
    Result = Table.AddColumn(Source , "Separateur" , each 
    let 
        separator = ", ", 
        a = List.Accumulate(
Text.ToList(Text.From([Data])),
"",
(s,c) =>  if List.Contains({"a".."z"},c) = List.Contains({"a".."z"},Text.End(s,1)) and 
             List.Contains({"A".."Z"},c) = List.Contains({"A".."Z"},Text.End(s,1)) and 
             List.Contains({"0".."9"},c) = List.Contains({"0".."9"},Text.End(s,1)) then s & c else s & separator & c )
    in Text.Range(a, Text.Length(separator) , Text.Length(a)-Text.Length(separator)) 
)
in
    Result

Bonsoir à tous !

@BAROUTE78 :

Je craignais que l'usage du List.Accumulate avec les 6 tests malmène la vélocité......

Un test, effectué sur une volumétrie de plus de 7000 lignes, démontre qu'il n'en est rien !

Hey,

@JFL, merci pour ces tests, finalement la vélocité de cette fonction n’est pas si mauvaise même si d’après ce que j’ai pu entrevoir, la fonction List.Generate reste plus véloce.

Cependant si on atteint pas le million de ligne la différence reste minime.

Je garde en tête ce petit test et merci pour le temps consacré

@+

Bonsoir à tous,

Belle démonstration.

Serait il possible d'avoir quelques explications sur les différentes étapes ?

Bonne soirée, cordialement.

Rechercher des sujets similaires à "petit challenge powerquery"