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

informer

Ma Minute M : Créer des lignes depuis des champs multi valués Table.ExpandListColumn Text.Split

Noter ce billet
par , 23/02/2025 à 19h42 (338 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 vaut mieux qu'une longue explication alors illustration

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


Et l'objectif est celui-ci
Nom : champsMultivaluésRésult.JPG
Affichages : 209
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 c : 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 c : 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 :

Code c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
<a href="https://powerquery.how/table-transformcolumns/" target="_blank">Table.TransformColumns</a>(  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 <a href="https://powerquery.how/table-transformcolumns/" target="_blank">ici</a>
   optional missingField as nullable number // Voir <a href="https://powerquery.how/table-transformcolumns/" target="_blank">ici </a>) as table


Le code pour transformer chaque colonne en objet liste

Code c : 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 c : 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 c : 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

C'est maintenant Votre Minute M !

Envoyer le billet « Ma Minute M : Créer des lignes depuis des champs multi valués Table.ExpandListColumn Text.Split » dans le blog Viadeo Envoyer le billet « Ma Minute M : Créer des lignes depuis des champs multi valués Table.ExpandListColumn Text.Split » dans le blog Twitter Envoyer le billet « Ma Minute M : Créer des lignes depuis des champs multi valués Table.ExpandListColumn Text.Split » dans le blog Google Envoyer le billet « Ma Minute M : Créer des lignes depuis des champs multi valués Table.ExpandListColumn Text.Split » dans le blog Facebook Envoyer le billet « Ma Minute M : Créer des lignes depuis des champs multi valués Table.ExpandListColumn Text.Split » dans le blog Digg Envoyer le billet « Ma Minute M : Créer des lignes depuis des champs multi valués Table.ExpandListColumn Text.Split » dans le blog Delicious Envoyer le billet « Ma Minute M : Créer des lignes depuis des champs multi valués Table.ExpandListColumn Text.Split » dans le blog MySpace Envoyer le billet « Ma Minute M : Créer des lignes depuis des champs multi valués Table.ExpandListColumn Text.Split » dans le blog Yahoo

Commentaires