IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

informer

Power Query - Ma Minute M : Développer des champs multivalués en lignes (expand mutiple values fields)

Noter ce billet
par , 23/02/2025 à 20h42 (185 Affichages)
Il n'est pas rare de trouver dans des sources de données au format Excel et autres, des champs avec des listes de valeurs. L'objectif est alors de créer une ligne supplémentaire par valeur de la liste. Un exemple voaut mieux qu'une longue explication alors illustration

La source de travail
Nom : champsMultivalués.JPG
Affichages : 142
Taille : 36,6 Ko


Et l'objectif est celui-ci
Nom : champsMultivaluésRésult.JPG
Affichages : 140
Taille : 33,9 Ko



Le langage M possède des fonctions extrêmement puissant pour réaliser cet opération. Il faut faire les opérations suivantes :
  1. Transformer les champs multivaluées en objet liste
  2. Développer les champs avec des objets listes


Voici le code dans son entier

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
let 
let 
Source = Excel.Workbook(File.Contents("C:\Data\Fichier.xlsx"), null, true),
DataTable = Source{[Item="Data",Kind="Table"]}[Data],
Typage = Table.TransformColumnTypes(DataTable,{{"Cost Item", type text}, {"Value", Int64.Type}, {"Location", type text}, {"Business", type text}, {"Department", type text}}),
ListInCol = 
  let 
    tblWithList = Table.TransformColumns(Typage,{{"Location", each Text.Split(_,",")},{"Business", each Text.Split(_,",")},{"Department", each Text.Split(_,",")} } ), anyOut = tblWithList
  in anyOut,
  ExpandLocation  = Table.ExpandListColumn(ListInCol, "Location"),
  ExpandBusiness = Table.ExpandListColumn(ExpandLocation, "Business"),
  ExpandDpt = Table.ExpandListColumn(ExpandDpt, "Department")
  in ExpandBusiness
Les 3 premières lignes sont pour le chargement et le formatage du fichier

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
Source =  Excel.Workbook(File.Contents("C:\Data\Fichier.xlsx"),  null, true),
DataTable = Source{[Item="Data",Kind="Table"]}[Data],
Typage  = Table.TransformColumnTypes(DataTable,{{"Cost Item", type text},  {"Value", Int64.Type}, {"Location", type text}, {"Business", type text},  {"Department", type text}}),
il faut ensuite transformer les colonnes de la liste en objet Liste

La fonction qui permet de modifier les colonnes est Table.TransformColumns dont la définition est :

Table.TransformColumns( table as table, // Source de données
transformOperations as list, // Méthode (fonction) appliquée aux colonnes {{NommDeColonne1, méthode1},...,{NommDeColonneN, méthodeN}}
optional defaultTransformation as nullable function,// Voir ici
optional missingField as nullable number // Voir ici ) as table

Le code pour transformer chaque colonne en objet liste

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
ListInCol = 
  let 
     tblWithList = Table.TransformColumns(Typage,{{"Location", each Text.Split(_,",")},{"Business", each Text.Split(_,",")},{"Department", each Text.Split(_,",")} } ), anyOut = tblWithList
  in anyOut,

Le code pour développer chaque colonne objet liste en ligne

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
ExpandLocation  = Table.ExpandListColumn(ListInCol, "Location"),
ExpandBusiness = Table.ExpandListColumn(ExpandLocation, "Business"),
ExpandDpt = Table.ExpandListColumn(ExpandDpt, "Department")
in ExpandBusiness

Code générique pour ne pas écrire les noms de colonnes en dur

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
ListInCol = 
  let 
    lstColName = Table.ColumnNames(Typage)
    ,lstFieldForExpand = List.Skip (lstColName, 2) 
    ,tblWithList = Table.TransformColumns( Typage,List.Transform(lstFieldForExpand, each {_, each Text.Split(_,",")})), anyOut = tblWithList
  in anyOut,
ColumnsExpanded = 
  let 
    lstColName = Table.ColumnNames(Typage) 
    ,lstFieldForExpand = List.Skip (lstColName, 2)
    ,anyOut = List.Accumulate (lstFieldForExpand , ListInCol, (anyFirstOut, anyCurr)=> Table.ExpandListColumn(anyFirstOut, anyCurr) )
  in anyOut 
in ColumnsExpanded

Envoyer le billet « Power Query - Ma Minute M : Développer des champs multivalués en lignes (expand mutiple values fields) » dans le blog Viadeo Envoyer le billet « Power Query - Ma Minute M : Développer des champs multivalués en lignes (expand mutiple values fields) » dans le blog Twitter Envoyer le billet « Power Query - Ma Minute M : Développer des champs multivalués en lignes (expand mutiple values fields) » dans le blog Google Envoyer le billet « Power Query - Ma Minute M : Développer des champs multivalués en lignes (expand mutiple values fields) » dans le blog Facebook Envoyer le billet « Power Query - Ma Minute M : Développer des champs multivalués en lignes (expand mutiple values fields) » dans le blog Digg Envoyer le billet « Power Query - Ma Minute M : Développer des champs multivalués en lignes (expand mutiple values fields) » dans le blog Delicious Envoyer le billet « Power Query - Ma Minute M : Développer des champs multivalués en lignes (expand mutiple values fields) » dans le blog MySpace Envoyer le billet « Power Query - Ma Minute M : Développer des champs multivalués en lignes (expand mutiple values fields) » dans le blog Yahoo

Mis à jour 23/02/2025 à 20h58 par informer

Catégories
Power Query , langage M

Commentaires