XL 2019 Power query - modifier le type des colonnes

Flx1er

XLDnaute Occasionnel
Bonjour,
Est-il possible de modifier dynamique le type des colonnes en fonction de certains intitulés.
Par exemple (cf fichier joint), si l'intitulé commence par "Nombre"; "Age" alors le type des colonnes respectives sera de type number
En vous remerciant
 

Pièces jointes

  • Modifer le type.xlsx
    18.5 KB · Affichages: 3

mromain

XLDnaute Barbatruc
Bonjour Flx1er, le forum,

Tu peux tester avec ce code :
PowerQuery:
let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("XYvBDcAwCAN34W0pmJC0mYWw/xrNp1Lp887nCFe4Y3WI+W5qu5maC9aAsJhfINZLnwhiDtyEKL/TEcZ61YrzIF+8mPkA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Nombre 1 = _t, Nombre 2 = _t, Nombre 3 = _t, Date 1 = _t, Nombre 4 = _t, Date 2 = _t, Date 3 = _t, Date 4 = _t, Nombre 5 = _t]),
    transformationsList = {{each Text.StartsWith(_, "Nombre"), type number}, {each Text.StartsWith(_, "Date"), type date}},
    ChangeTypes = 
        let
            colNames = List.Buffer(Table.ColumnNames(Source)),
            transformations = List.Combine(List.Transform(transformationsList, each let current = _, columns = List.Select(colNames, current{0}) in List.Transform(columns, each {_, current{1}})))
        in
            Table.TransformColumnTypes(Source, transformations)
in
    ChangeTypes

A+
 

Flx1er

XLDnaute Occasionnel
Bonjour Flx1er, le forum,

Tu peux tester avec ce code :
PowerQuery:
let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("XYvBDcAwCAN34W0pmJC0mYWw/xrNp1Lp887nCFe4Y3WI+W5qu5maC9aAsJhfINZLnwhiDtyEKL/TEcZ61YrzIF+8mPkA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Nombre 1 = _t, Nombre 2 = _t, Nombre 3 = _t, Date 1 = _t, Nombre 4 = _t, Date 2 = _t, Date 3 = _t, Date 4 = _t, Nombre 5 = _t]),
    transformationsList = {{each Text.StartsWith(_, "Nombre"), type number}, {each Text.StartsWith(_, "Date"), type date}},
    ChangeTypes =
        let
            colNames = List.Buffer(Table.ColumnNames(Source)),
            transformations = List.Combine(List.Transform(transformationsList, each let current = _, columns = List.Select(colNames, current{0}) in List.Transform(columns, each {_, current{1}})))
        in
            Table.TransformColumnTypes(Source, transformations)
in
    ChangeTypes

A+
Merci mromain,
Ta solution fonctionne à merveille.
Encore merci

 

Flx1er

XLDnaute Occasionnel
Bonjour,

Je ré-ouvre ce post pour vous demander une faisabilité : s'il est possible de modifier le type de chaque colonne en utilisant 2 list :
  • 1ere liste contient les noms de chaque colonne
  • 2d liste contient les types de chaque colonne
Le document joint intègre ces 2 listes au niveau de la requête Format type. Mais je ne trouve pas la métho pour exploiter ces 2 listes
En vous remerciant
 

Pièces jointes

  • Modifer le type v2.xlsx
    23.9 KB · Affichages: 6

mromain

XLDnaute Barbatruc
Bonjour Flx1er, le forum,

Ci-dessous un essai :
PowerQuery:
let
    DefModifTypes =
        let
            Noms_colonnes = Excel.CurrentWorkbook(){[Name="Noms_cols"]}[Content][Column1],
            Type_colonne = Excel.CurrentWorkbook(){[Name="Types_cols"]}[Content][Column1]
        in
            List.Zip({Noms_colonnes, List.Transform(Type_colonne, Expression.Evaluate)}),
    Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
    TypesModifiés = Table.TransformColumnTypes(Source,DefModifTypes)
in
    TypesModifiés

A+
 

Cousinhub

XLDnaute Barbatruc
Bonjour,
J'avais également trouvé une solution, mais non aboutie, car la transformation ne supportait pas le type "Int64.Type", ni tous les typages en ".Type"...
Je vois qu'il en est de même avec la solution de romain :confused:

Après transformation de la plage dans l'onglet "param" en TS nommé T_Types, le code :

PowerQuery:
let
    Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
    ModType = Table.TransformColumnTypes(Source,List.Zip({T_Types[Colonne],List.Transform(T_Types[Type],Expression.Evaluate)}))
in
    ModType

Je ne sais pas s'il est possible de déterminer ainsi le type des "Int64.Type, Percent.Type...."
Bonne apm
 

Pièces jointes

  • PQ_ModifType selon choix.xlsx
    21.9 KB · Affichages: 7

mromain

XLDnaute Barbatruc
Bonjour Cousinhub,

Je ne sais pas s'il est possible de déterminer ainsi le type des "Int64.Type, Percent.Type...."

C'est possible oui.
L'erreur se déclenche car dans le contexte d'évaluation par défaut, il ne connait pas la fonction Int64.Type.

Tu trouveras ci-dessous 2 moyens de faire fonctionner la chose :
PowerQuery:
let
    Erreur = Expression.Evaluate("Int64.Type"),
    SansErreur1 = Expression.Evaluate("Int64.Type", [Int64.Type = Int64.Type]),
    SansErreur2 = Expression.Evaluate("Int64.Type", #shared),
    WTF = Expression.Evaluate("List.Max({1, 9})", [List.Max = List.Min])
in
    WTF

Le dernier exemple sert juste à montrer que dans ce contexte d'évaluation, on dit que List.Max vaut List.Min

A+
 

Discussions similaires

Réponses
13
Affichages
506

Statistiques des forums

Discussions
312 213
Messages
2 086 302
Membres
103 174
dernier inscrit
OBUTT