Club Power BI

Please login or click SIGN UP FOR FREE to create your PowerBIUG account to join this user group.
 View Only
  • 1.  Optimisation import csv quotidien en masse

    Posted 9 days ago
    Bonjour à tous,

    J'exporte tous les jours de SAP des tables en fichier .csv afin de pouvoir garder un historique et faire des courbes d'évolution et d'analyse dans Power BI.
    Une connexion directe ne me permettrait que d'avoir un état instantané, et la fonction n'est de toute façon pas encore disponible chez nous.

    Chaque export de chaque table est rangé dans un dossier particulier.

    J'utilise l'importation par dossier et ma problématique est que cela représente une centaine de fichiers csv de chaque type dans plusieurs dossiers

    Chaque jour PowerBI réimporte donc les mêmes fichiers + les nouveaux du jour, ce qui prend tous les jours de plus en plus de temps pour des taches inutiles.
    Je précise qu'une fois exporté, les csv ne sont que très rarement modifiés à posteriori.

    Auriez vous des idées afin d'optimiser tout ça ?

    N'y aurait il pas une méthode pour importer les csv dans une table, les archivés puis rajouté tous les jours uniquement les nouveaux fichiers ?
    Ou de n'importé dans le dossier que les nouveaux fichiers ou ceux qui auraient été modifié un peu comme dans un direct query ?

    A l'heure actuelle, ma seule idée serait de créer un fichier Excel avec une macro pour importer les csv, et déplacer les csv déjà importé dans un dossier d'archive, un onglet par type de csv, et de connecter PowerBI à ce fichier Excel... l'importation d'un fichier Excel étant bien plus rapide que l'importation de plusieurs centaines de csv à nombre de ligne équivalent...

    Nous disposons d'un sharepoint d'entreprise et de PowerBI prémium

    ------------------------------
    Guillaume Ragues
    Responsable amélioration continue
    ------------------------------


  • 2.  RE: Optimisation import csv quotidien en masse

    Gold Contributor
    Posted 9 days ago
    Bonjour Guillaume,

    Je vous conseille de mettre en place un rafraîchissement incrémental en vous basant sur la date de création ou la date de modification de vos fichiers (propriétés disponibles en utilisant le connecteur Site SharePoint).

    Cela fonctionne parfaitement et ne nécessite même pas Power BI Premium.
    Bon courage !

    ------------------------------
    Tristan Malherbe
    Co-Fondateur du Club Power BI
    Expert/Formateur Power BI - Microsoft MVP
    ------------------------------



  • 3.  RE: Optimisation import csv quotidien en masse

    Bronze Contributor
    Posted 8 days ago

    A titre d'exemple, voici un code qui s'inspire d'un article très instructif de Miguel Escobar sur ce sujet (Incremental refresh for files in a Folder or SharePoint). Un des points importants (cf commentaire) est de prévoir le cas où la combinaison de dates d'une partition ne ramène aucun résultat. Afin d'éviter une erreur, la dernière étape permet de retourner une table vide ayant le même schema que lorsqu'il y a des resultats.

    Après avoir examiné les traces http dans Fiddler, j'ai opté pour Sharepoint.Contents plutot que Sharepoint.Files. Il m'a semblé que le Query folding fonctionnait mieux ainsi.

    // Events
    let
        Source = SharePoint.Contents(myOneDriveURL, [ApiVersion = 15]),
        Documents = Source{[Name="Documents"]}[Content],
        #"Power BI Audit events" = Documents{[Name="Power BI Audit events"]}[Content],
        #"Filtered Rows" = Table.SelectRows(#"Power BI Audit events", each [Date created] >= DateTimeZone.From(RangeStart) and [Date created] <= DateTimeZone.From(RangeEnd)),
        BufferBinaries = List.Transform(#"Filtered Rows"[Content],Binary.Buffer),
        TransformEachFile = List.Transform(BufferBinaries, f_TransformCSV),
        CombineIntoTable = Table.Combine(TransformEachFile),
        TryError = try CombineIntoTable otherwise Emptytable
    in
        TryError
    
    // RangeStart
    #datetime(2021, 1, 1, 0, 0, 0) meta [IsParameterQuery=true, Type="DateTime", IsParameterQueryRequired=true]
    
    // RangeEnd
    #datetime(2021, 1, 5, 0, 0, 0) meta [IsParameterQuery=true, Type="DateTime", IsParameterQueryRequired=true]
    
    // f_TransformCSV
    let
        Source = (Content as binary) => let
        #"Imported CSV" = Csv.Document(Content,[Delimiter=",", Encoding=65001, QuoteStyle=QuoteStyle.None]),
        #"Promoted Headers" = Table.PromoteHeaders(#"Imported CSV", [PromoteAllScalars=true]),
        #"Removed Other Columns" = Table.SelectColumns(#"Promoted Headers",{"CreationTime", "Operation", "WorkSpaceName", "DatasetName", "ReportName", "WorkspaceId", "ObjectId", "DatasetId", "ReportId"}),
        #"Changed Type" = Table.TransformColumnTypes(#"Removed Other Columns",{{"CreationTime", type datetime}, {"Operation", type text}, {"WorkSpaceName", type text}, {"DatasetName", type text}, {"ReportName", type text}, {"WorkspaceId", type text}, {"ObjectId", type text}, {"DatasetId", type text}, {"ReportId", type text}})
    in
        #"Changed Type"
    in
        Source
    
    // Emptytable
    let
        Source = #table (type table 
        [
            #"CreationTime" = datetime,
            #"Operation" = text,
            #"WorkSpaceName" = text,
            #"DatasetName" = text,
            #"ReportName" = text,
            #"WorkspaceId" = text,
            #"ObjectId" = text,
            #"DatasetId" = text,
            #"ReportId" = text
        ] ,{})
    in
        Source


    ------------------------------
    Bertrand d'Arbonneau
    ------------------------------