L'informatique à votre portée
L'informatique prêt-à-porter

Faites appel à moi pour vos formations
sur les dpts 81, 31, 82, 11 et 67 (Strasbourg)
Confiez moi vos développements Office

FacebookTwitterGoogle BookmarksLinkedin

Power Query

Combiner des pages

12 juillet 2016
Imprimer E-mail

Que ce soit pour un fichier de type json, une page web ou flux O'Data, nous ne pouvons pas toujours  récupérer l'ensemble des données en une seule fois. Bien souvent celles-ci sont découpées en plusieurs pages.

Nous devons donc combiner l'ensemble de ces pages, mais tout est ok si nous connaissons à l'avance le nombre de pages. Lorsque le nombre de pages à récupérer est totalement inconnu, c'est de suite beaucoup plus dur.

Pour vous montrer comment faire, je vais utiliser un classeur Excel contenant un tableau et récupérer le contenu de ce tableau dans une requête 10 lignes par 10 lignes. Je vais donc ainsi simuler la lecture de plusieurs pages.

Construction du fichier d'exemple

Dans un classeur Excel, créez un Tableau similaire à celui-ci. Peut importe les titres, les données et le nombre de colonnes ou lignes de ce tableau.

tableau-exemple

Création d'une fonction Power Query

La difficulté réside ici. Vous devez écrire une fonction que vous nommerez par exemple, fnGetVentes, qui permet de récupérer chaque page de votre source. Voici donc le script pour mon exemple :

(Page as number, MaTable as table)  =>
let
    Source = Table.Range( Excel.CurrentWorkbook(){[Name="t_Ventes"]}[Content], Page*10 , 10),
    NbLignes = Table.RowCount(Source ),
    CombineResult = Table.Combine({MaTable , Source }),
    Resultat = if NbLignes = 0 then CombineResult else fnGetVentes (Page + 1, CombineResult )
in
    Resultat

Le contenu de Source doit bien entendu être adapté à vos besoins. Cela peut par exemple être quelque chose du style (ne tester pas cette adresse, elle n'est que partielle) :

Source = Json.Document(Web.Contents("https://.../opendatasoft/datasets/a-noms-de-domaine-en-fr/exports/json?page=" & Number.ToText(Page))

Comme vous le constatez cette ligne de source utilise l'argument Page afin de récupérer les données de la page n° x.

NbLignes permet simplement de tester le nombre de lignes renvoyées par Source. Si ce nombre est à 0 alors nous sommes arrivés à la fin des pages.

Entre l'étape NbLignes et CombineResult, vous pouvez évidemment avoir d'autres étapes de transformation de vos données.

CombineResult combine simplement le résultat de Source avec la table passé dans l'argument MaTable.

Dans Resultat, on teste le nombre de lignes, si celui-ci est à 0 alors on est à la fin et dans ce cas on récupère simplement le tableau de CombineResult, sinon on appelle de nouveau la fonction avec une incrémentation du numéro de page et le résultat du tableau de CombineResult. Ce dernier est envoyé dans l'argument MaTable et sera donc combinée avec les résultats de la nouvelle page.

Nous venons donc de créer une fonction RECURSIVE, soit l'équivalent d'une boucle.

Utiliser la fonction récursive

Il vous faut bien entendu appeler une 1ère fois la fonction afin de lancer la boucle. Pour l'exemple de mon tableau le script est :

let
    Page = 0,
    Source = Table.Range( Excel.CurrentWorkbook(){[Name="t_Ventes"]}[Content], Page*10 , 10),
    NbLignes = Table.RowCount(Source),
    Resultat = if NbLignes = 10 then fnGetVentes(Page + 1, Source) else Source
in
    Resultat

Dans une première étape, j'attribue la valeur 0 pour la 1ère page. Si pour vos données, la 1ère page a le numéro 1, remplacez simplement le 0 par 1.

L'étape Source est bien entendu à adapter avec votre propre source. Dans le cas de cet exemple Excel.CurrentWorkbook(){[Name="t_Ventes"]}[Content] récupère le contenu du table  du classeur.
Table.Range( Excel.CurrentWorkbook(){[Name="t_Ventes"]}[Content], Page*10 , 10) permet de récupérer le contenu de 10 lignes de ce tableau.

Ensuite, je compte le nombre de lignes au cas où il n'y aurait qu'une page puis dans Resultat je fais le même test que dans la fonction et si besoin appelle pour la 1ère fois la fonction en lui envoyant le 2e numéro de page et le tableau résultat de la 1ère page.

A vous maintenant d'adapter cet exemple pour vos besoins, vous pouvez également adapter cette fonction afin de lire des données selon un décalage ou offset prédéterminé.