2023-11-21
Lorsqu’on charge une source dans PowerQuery, il arrive que le format de la source change (d’un fichier à l’autre par exemple). Même si on préfèrerait refuser le fichier et imposer un format, ce n’est pas toujours possible… Il faut parfois savoir s’adapter.
Disons que je charge un tableau avec les en-têtes en première ligne et que certains en-têtes ne sont pas définis. En utilisant la fonction “Utiliser la première ligne pour les en-têtes”, les colonnes avec une valeur vide dans les premières lignes seront nommées Column1, Column2, Column3…
Pour supprimer les colonnes sans en-tête on va lister ces colonnes et utiliser cette liste dans une fonction Table.RemoveColumns :
let
Source = TableSource,
PromotedHeaders = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
ColumnsToRemove = List.Select(Table.ColumnNames(PromotedHeaders), each Text.StartsWith(_, "Column")),
RemovedColumns = Table.RemoveColumns(PromotedHeaders,ColumnsToRemove)
in
RemovedColumns
Même méthode ! Mais en modifiant le filtre appliqué. Plutôt que each Text.StartsWith(_, "Column")
on va utiliser un filtre qui correspond au cas d’usage.
Et si on souhaite conserver certaines colonnes plutôt que de les supprimer, on utilisera la fonction Table.SelectColumns qui supprime les autres colonnes.
Dans mon exemple les colonnes des valeurs ont une année dans l’en-tête. Cela est contraignant si le libellé change : mes colonnes “Value 2023” et “Value 2022” vont devenir “Value 2024” et “Value 2023” l’année prochaine. Pour avoir des noms de colonnes constants, on souhaite renommer dynamiquement ces colonnes en “Value N” et “Value N-1”.
On va donc une liste dynamique dans la fonction Table.RenameColumns pour renommer les colonnes :
let
Source = Faits,
ColumnNames = List.Select(Table.ColumnNames(Source), each Text.StartsWith(_, "Value")),
ConvertedToTable = Table.FromList(ColumnNames, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
AddedRenamedColumn = Table.AddColumn(ConvertedToTable, "Column2", each Text.Replace(Text.Replace([Column1], "2023", "N"), "2022", "N-1")),
AddedListColumn = Table.AddColumn(AddedRenamedColumn, "ColumnL", each Record.ToList(_)),
ConvertToList = AddedListColumn[ColumnL],
RenamedColumns = Table.RenameColumns(Source,ConvertToList)
in
RenamedColumns
Il arrive que certaines colonnes nécessaires au chargement soient absentes du fichier source. Il faut alors les ajouter dans les premières étapes du traitement. La méthode la plus simple pour faire cela est de définir la liste des colonnes nécessaire au traitement et de la combiner à la requête initiale pour que celle-ci soit complétée avec les colonnes manquantes.