Gestion des transformations

Dans les cas où la réponse de la source de données n’est pas présentée dans un format que Power BI peut consommer directement, Power Query peut être utilisé pour effectuer une série de transformations.

Transformations statiques

Dans la plupart des cas, la source de données présente les données de manière cohérente : les noms de colonnes, les types de données et la structure hiérarchique sont cohérents pour un point de terminaison donné. Dans ce cas, il est approprié d’appliquer toujours le même ensemble de transformations pour obtenir les données dans un format acceptable pour Power BI.

Vous trouverez un exemple de transformation statique dans la partie 2 tripPin - Connecteur de données pour un didacticiel sur le service REST lorsque la source de données est traitée comme un service REST standard :

let
    Source = TripPin.Feed("https://services.odata.org/v4/TripPinService/Airlines"),
    value = Source[value],
    toTable = Table.FromList(value, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    expand = Table.ExpandRecordColumn(toTable, "Column1", {"AirlineCode", "Name"}, {"AirlineCode", "Name"})
in
    expand

Les transformations de cet exemple sont les suivantes :

  1. Source est un enregistrement retourné par un appel à TripPin.Feed(...).
  2. Vous extrayez la valeur de l’une des Source paires clé-valeur. Le nom de la clé est value, et vous stockez le résultat dans une variable appelée value.
  3. value est une liste, que vous convertissez en table. Chaque élément dans value devient une ligne dans la table, que vous pouvez appeler toTable.
  4. Chaque élément dans value est lui-même un enregistrement. toTable a tous ces éléments dans une seule colonne : "Column1". Cette étape extrait toutes les données avec clé "AirlineCode" dans une colonne appelée "AirlineCode" et toutes les données avec clé "Name" dans une colonne appelée "Name", pour chaque ligne dans toTable. "Column1" est remplacé par ces deux nouvelles colonnes.

À la fin de la journée, vous êtes laissé avec des données dans un format tabulaire simple que Power BI peut consommer et afficher facilement :

Capture d’écran des données sous forme tabulaire.

Il est important de noter qu’une séquence de transformations statiques de cette spécificité ne s’applique qu’à un seul point de terminaison. Dans l’exemple précédent, cette séquence de transformations fonctionne uniquement si "AirlineCode" et "Name" existe dans la réponse du point de terminaison REST, car elles sont codées en dur dans le code M. Par conséquent, cette séquence de transformations peut ne pas fonctionner si vous essayez d’atteindre le /Event point de terminaison.

Ce niveau élevé de spécificité peut être nécessaire pour envoyer des données à une table de navigation. Toutefois, pour les fonctions d’accès aux données plus générales, nous vous recommandons d’effectuer uniquement des transformations appropriées pour tous les points de terminaison.

Note

Veillez à tester les transformations dans différentes circonstances de données. Si l’utilisateur n’a pas de données au niveau du /airlines point de terminaison, vos transformations entraînent-elles une table vide avec le schéma approprié ? Ou une erreur est-elle rencontrée lors de l’évaluation ? Consultez TripPin Partie 7 : Schéma avancé avec types M pour une discussion sur les tests unitaires.

Transformations dynamiques

Une logique plus complexe est parfois nécessaire pour convertir les réponses d’API en formulaires stables et cohérents appropriés pour les modèles de données Power BI.

Réponses d’API incohérentes

Flux de contrôle M de base (instructions if, codes d’état HTTP, blocs try...catch, et ainsi de suite) sont généralement suffisants pour gérer les situations où l’API peut répondre de plusieurs façons.

Détermination dynamique du schéma

Certaines API sont conçues de sorte que plusieurs informations doivent être combinées pour obtenir le format tabulaire correct. Considérez la réponse de l'endpoint /sheetsde Smartsheet, qui contient un tableau de noms de colonnes et un tableau de lignes de données. Le connecteur Smartsheet est en mesure d’analyser cette réponse de la façon suivante :

raw = Web.Contents(...),
columns = raw[columns],
columnTitles = List.Transform(columns, each [title]),
columnTitlesWithRowNumber = List.InsertRange(columnTitles, 0, {"RowNumber"}),
                
RowAsList = (row) =>
    let
        listOfCells = row[cells],
        cellValuesList = List.Transform(listOfCells, each if Record.HasFields(_, "value") then [value]
                else null),
        rowNumberFirst = List.InsertRange(cellValuesList, 0, {row[rowNumber]})
    in
        rowNumberFirst,

listOfRows = List.Transform(raw[rows], each RowAsList(_)),
result = Table.FromRows(listOfRows, columnTitlesWithRowNumber)
  1. Commencez par traiter les informations d’en-tête de colonne. Vous pouvez extraire l'enregistrement title de chaque colonne dans la liste, en préfixant avec une colonne RowNumber que vous savez être toujours représentée comme la première colonne.
  2. Ensuite, vous pouvez définir une fonction qui vous permet d’analyser une ligne dans une liste de cellules value. Vous pouvez à nouveau ajouter des rowNumber informations.
  3. Appliquez la fonction RowAsList() à chacun des row retournés dans la réponse de l’API.
  4. Convertissez la liste en tableau, en spécifiant les en-têtes de colonne.