Power query fichier .htm optimiser code

10test.xlsx (11.34 Ko)

Bonjour,

J'ai plein de fichier .htm dans un dossier que j'essaye d'exploiter
Ce code ci-dessous que j'ai travailler fonctionne mais il y a deux problèmes :
- le 1er est que je veux garder une colonne qui se nomme "Name" elle est bien à l'étape ExpandesTables par contre aprés quand je fait l'étape CombinedTables elle disparait et je n'arrive pas à l'inclure.Aprés le développement il ya bien une colonne Name mais ce n'ai pas la même.

- le second problème est que la requête est lente et à du mal à charger.
Je pense que c'est parce'que les fichier .htm sont lourd et il y en à pleins mais bon le code fonctionne mais dur dur

Une piste est de filtré le plus tot possible cette étape

    Filtre = Table.SelectRows(ColRename, each ([Montant] <> null and [Montant] <> "" and [Montant] <> "Client             Nom du client            Article          Désignation article          Prix Unit.      Quantité       Montant") and ([Nom Client] <> "" and [Nom Client] <> "Total agence commerciale" and [Nom Client] <> "Total Client" and [Nom Client] <> "Total Général")),

Voici le code ci-dessous

let
    // Spécifiez le chemin du dossier contenant les fichiers .htm
    FolderPath = "C:\Users\test",

    // Récupérer tous les fichiers dans le dossier
    Source = Folder.Files(FolderPath),

    // Filtrer pour ne garder que les fichiers .htm
    HtmlFiles = Table.SelectRows(Source, each Text.EndsWith([Name], ".htm")),

    // Charger chaque fichier HTML et extraire les tableaux
    GetTables = Table.AddColumn(HtmlFiles, "Tables", each 
        let
            Page = Web.Page(File.Contents([Folder Path] & [Name])),
            Data = Page[Data]
        in
            if List.Count(Data) > 0 then Data else {}
    ),

    // Développer les colonnes contenant les tableaux
    ExpandedTables = Table.ExpandListColumn(GetTables, "Tables"),

    // Combiner tous les tableaux en un seul (si nécessaire)
    CombinedTables = Table.Combine(ExpandedTables[Tables]),
    // Modifier le type des colonnes si nécessaire
    ColModif = Table.TransformColumnTypes(CombinedTables,{{"Column1", Int64.Type}, {"Column2", type text}, {"Column3", type text}, {"Column4", type text}, {"Column5", type text}, {"Column6", type text}, {"Column7", type text}}),
    ColSupp = Table.SelectColumns(ColModif,{"Column1", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7"}),
    ColRename = Table.RenameColumns(ColSupp,{{"Column1", "N°Client"}, {"Column2", "Nom Client"}, {"Column3", "N°Article"}, {"Column4", "Désignation"}, {"Column5", "Qté"}, {"Column6", "Prix unitaire"}, {"Column7", "Montant"}}),
    Filtre = Table.SelectRows(ColRename, each ([Montant] <> null and [Montant] <> "" and [Montant] <> "Client             Nom du client            Article          Désignation article          Prix Unit.      Quantité       Montant") and ([Nom Client] <> "" and [Nom Client] <> "Total agence commerciale" and [Nom Client] <> "Total Client" and [Nom Client] <> "Total Général")),
    FormatNombre = Table.TransformColumnTypes(Filtre, {{"Montant", type number}}, "en-US")
In FormatNombre

En PJ le fichier excel les deux exemples de mes tables

Hello,

Problème 1 : remplacer l'étape du combine par

= Table.FromPartitions("Name", List.Zip({ExpandedTables[Name],ExpandedTables[Tables]}))

Problème 2 : pour faire ton filtre tu prends ta colonne 4 et tu fais différent de null ou vide ce sera plus optimisé

@+

Bonjour Baroute78,

Merci mais en faisant ce que tu dit, j'ai l'erreur suivante
Expression.Error : La partition spécifiée n'est pas valide. Chaque partition doit correspondre à une liste de deux éléments composée d'une clé unique et d'une table associée.
Détails :
[List]

Pour le second problème mon code rame au moment de combiner
// Combiner tous les tableaux en un seul (si nécessaire)
CombinedTables = Table.Combine(ExpandedTables[Tables]),

Cordialement,

Hey,

T'es sûr que tu as bien mis ça :

= Table.FromPartitions("Name",List.Zip({ExpandedTables[Name],ExpandedTables[Tables]}))

Je viens de reproduire l'équivalent de ton tableau enfin la situation dans laquelle tu es donc avec un Table.Combine, ça me compile toutes les "Table" de la colonne "Tables" comme suit :

image image

Avec Table.FromPartitions :

image image

T'es bien dans ce cas là ?

@+

Bonjour,

Non dans mon cas complexe cela ne fonctionne pas, le problème est que mes fichiers .htm sont confidentiels.
En réalité mon code fonctionne mais je perd la colonne "Name" quand je fait l'étape "CombinedTables" mais il fonctionne.

Pour ce qui est lent je pense que mon code est mal fait.
Je me en PJ les étapes dans chaque onglet

Ce qui faut comprendre c'est que la PJ c'est pour démontrer que que les étapes font et c'est bon
Ce sont biens des fichiers .htm qui se trouve dans un dossier

Merci pour avoir émis une solution
J'aurais eu c'est fichiers en CSV cela aurait était mieux je sais mieux gérer mais là ce n'est pas le cas

5test-v2.xlsx (39.81 Ko)

Hello Maverick,

J'ai bien regardé ton fichier et à partir de l'étape ExpandedTables on a le même cas de figure à savoir :

- Des colonnes qui ne servent à rien que tu ne veux plus (Content, extension etc)

- Colonne Name que tu veux conserver

- Colonne Tables avec les table que tu veux compiler ensemble

Regarde mon fichier en PJ, on a le même cas et de mon côté le Table.FromPartitions fonctionne.

Peux être que tu comprendras d'où vient le souci avec mon fichier, c'est la requête Tableau1 dans l'éditeur PQ.

@+

5test-14.xlsx (19.28 Ko)

Bonjour,

Chez moi avec mon cas complet cela ne fonctionne pas, je vais regarder au calme quand j'aurais plus de temps
Merci pour ta solution

Cordialement,

Bonjour,

J'ai trouvé la solution pour mon cas par contre mon code est lourd et le chargement est trés lent

Je pense que c'est parce que j'ai beaucoup de fichier .htm dans un dossier qui sont lourd

Peut-on améliorer ou faire quelque chose, merci d'avance

Voici mon code

let
    // Spécifiez le chemin du dossier contenant les fichiers .htm
    FolderPath = "C:\Users\test",

    // Récupérer tous les fichiers dans le dossier
    Source = Folder.Files(FolderPath),

    // Filtrer pour ne garder que les fichiers .htm
    HtmlFiles = Table.SelectRows(Source, each Text.EndsWith([Name], ".htm")),

    // Charger chaque fichier HTML et extraire les tableaux
    GetTables = Table.AddColumn(HtmlFiles, "Tables", each 
        let
            Page = Web.Page(File.Contents([Folder Path] & [Name])),
            Data = Page[Data]
        in
            if List.Count(Data) > 0 then Data else {}
    ),

    // Développer les colonnes contenant les tableaux
    ExpandedTables = Table.ExpandListColumn(GetTables, "Tables"),

    // Créer des enregistrements avec le nom et la table
    NameTableRecords = Table.AddColumn(ExpandedTables, "NameTableRecord", each [Name = [Name], Table = [Tables]]),

    // Créer la table finale à partir des enregistrements
    CombinedTables = Table.FromRecords(NameTableRecords[NameTableRecord]),
    #"Table développé" = Table.ExpandTableColumn(CombinedTables, "Table", {"Column1", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7"}, {"Column1", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7"}),
    // Modifier le type des colonnes si nécessaire
    ColModif = Table.TransformColumnTypes(#"Table développé",{{"Column1", Int64.Type}, {"Column2", type text}, {"Column3", type text}, {"Column4", type text}, {"Column5", type text}, {"Column6", type text}, {"Column7", type text}}),
    ColRename = Table.RenameColumns(ColModif,{{"Column1", "N°Client"}, {"Column2", "Nom Client"}, {"Column3", "N°Article"}, {"Column4", "Désignation"}, {"Column5", "Qté"}, {"Column6", "Prix unitaire"}, {"Column7", "Montant"}}),
    Filtre = Table.SelectRows(ColRename, each ([Montant] <> null and [Montant] <> "" and [Montant] <> "Client             Nom du client            Article          Désignation article          Prix Unit.      Quantité       Montant") and ([Nom Client] <> "" and [Nom Client] <> "Total agence commerciale" and [Nom Client] <> "Total Client" and [Nom Client] <> "Total Général")),
    FormatNombre = Table.TransformColumnTypes(Filtre, {{"Montant", type number}}, "en-US"),
in FormatNombre

Cordialement,

Bonjour,

Le code power query ci-dessous me permet d'aller chercher un emsemble de fichier .htm et c'est lourd
Pour l'améliorer j'ai pensé à faire une fonction personnalisé et l'insérer dans le code pour d'abord réduire les étapes et surtout gagner en rapidité.
Par contre je ne sais pas comment faire, aucun idée

let
    // Spécifiez le chemin du dossier contenant les fichiers .htm
    FolderPath = "C:\Users\test,

    // Récupérer tous les fichiers dans le dossier et filtrer pour ne garder que les fichiers .htm
    HtmlFiles = Table.SelectRows(Folder.Files(FolderPath), each Text.EndsWith([Name], ".htm")),

    // Charger chaque fichier HTML et extraire les tableaux
    GetTables = Table.AddColumn(HtmlFiles, "Tables", each 
        let
            Page = Web.Page(File.Contents([Folder Path] & [Name])),
            Data = Page[Data]
        in
            if List.Count(Data) > 0 then Data else {}
    ),

    // Développer les colonnes contenant les tableaux et créer des enregistrements
    ExpandedTables = Table.ExpandListColumn(GetTables, "Tables"),
    CombinedTables = Table.FromRecords(Table.AddColumn(ExpandedTables, "NameTableRecord", each [Name = [Name], Table = [Tables]])[NameTableRecord]),

    // Développer la table combinée
    ExpandedCombined = Table.ExpandTableColumn(CombinedTables, "Table", {"Column1", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7"}, {"N°Client", "Nom Client", "N°Article", "Désignation", "Qté", "Prix unitaire", "Montant"}),
    // Modifier le type des colonnes si nécessaire
    ColModif = Table.TransformColumnTypes(ExpandedCombined,{{"N°Client", Int64.Type}, {"Nom Client", type text}, {"N°Article", type text}, {"Désignation", type text}, {"Qté", type text}, {"Prix unitaire", type text}, {"Montant", type text}}),
    Filtre = Table.SelectRows(ColModif, each ([Montant] <> null and [Montant] <> "" and [Montant] <> "Client             Nom du client            Article          Désignation article          Prix Unit.      Quantité       Montant") and ([Nom Client] <> "" and [Nom Client] <> "Total agence commerciale" and [Nom Client] <> "Total Client" and [Nom Client] <> "Total Général")),
    FormatNombre = Table.TransformColumnTypes(Filtre, {{"Montant", type number},{"Qté", type number}, {"Prix unitaire", type number}}, "en-US"),
    // Remplacer les valeurs dans les colonnes "Nom Client" et "N°Client" en une seule étape
    Remplace = Table.ReplaceValue(FormatNombre, """", null, Replacer.ReplaceValue, {"Nom Client"}),RemplaceFinal = Table.ReplaceValue(Remplace, "", null, Replacer.ReplaceValue, {"N°Client"}),
    RemplirBas = Table.FillDown(RemplaceFinal,{"N°Client", "Nom Client"}),
    FusionCC = Table.NestedJoin(RemplirBas, {"N°Client"}, Base_CC, {"Compteclient"}, "Base_CC", JoinKind.LeftOuter),
    Devlpt = Table.ExpandTableColumn(FusionCC, "Base_CC", {"CDC", "AFFECTATION"}, {"CDC", "AFFECTATION"}),
    Détail = Table.AddColumn(Devlpt, "DETAIL", each if [AFFECTATION] = null then [CDC] else [AFFECTATION]),
    ColPermut = Table.ReorderColumns(Détail,{"Name", "DETAIL", "N°Client", "Nom Client", "N°Article", "Désignation", "Qté", "Prix unitaire", "Montant"}),
    Filtre0 = Table.SelectRows(ColPermut, each ([Montant] <> 0)),
    Tri = Table.Sort(Filtre0,{{"Name", Order.Ascending}, {"DETAIL", Order.Ascending}, {"N°Client", Order.Ascending}}),
    ColSupp = Table.SelectColumns(Tri,{"Name", "DETAIL", "N°Client", "Nom Client", "N°Article", "Désignation", "Qté", "Prix unitaire", "Montant"})
in
    ColSupp

Merci d'avance

Bonjour,

Une idée, juste pour voir (non testée, pour cause....)

L'idée serait de limiter les filtres (étape "Filtre"), comme ceci :

let
    Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
    ModType = Table.TransformColumnTypes(Source,{{"Essai", type number}}),
    //Je transforme les valeurs de la colonne "Essai" en type number
    //S'il y a du texte, ces valeurs se transforment en "error"
    ListCols = List.Buffer(Table.ColumnNames(ModType)),
    //Mise en mémoire des titres de colonne
    RemoveErrors = Table.RemoveRowsWithErrors(ModType,ListCols)
    //Suppression des lignes contenant des "error"
in
    RemoveErrors

On transforme les valeurs des colonnes "numériques" ("Montant", "Qté" et "Prix unitaire" dans ton code) en type "number"

Les valeurs textuelles vont générer des erreurs, il suffira donc de supprimer ces lignes...

Peut-être une petite amélioration?

Bonjour cousinhub,

Je met en PJ un échantillon de mon tableau aprés l'étape "ExpandedCombined"
Il faut savoir que le tableau fait plus de 30 000 lignes c'est pour cela que c'est lourd et qui charge plusieurs fichier .htm

Pour l'astuce du filtre pourrais tu le faire à partir du tableau test pour que je comprenne bien.
Je me suis rendu compte que avant je croyais avoir bon mais il y a un souci que j'ai mis en jaune
Quand il ya une régularisation et bien l'aticle n'est pas répété juste " en dessous de "Désignation article" car c'est le même.

Donc il faut bien je part de la colonne montant comme tu as indiqué juste avant sur le filtre puis retiré aussi le "Total Client" et "Total Général"

Aprés le code n'est pas optimal mais tout seul c'est compliqué

Voici le fichier Test

9test.xlsx (22.84 Ko)

Bonjour,

Comme on ne peut pas voir comment les tables sont importées (quelle structure, sous quelle forme...), difficile de t'aider plus

Par exemple, en colonne B, il y a la première ligne (unique), puis deux lignes qui se répètent... S'agit-il de la même table?

Bref, sans fichier htm "exemple", (mais représentatif), perso, je ne sais pas.

Bon courage

Bonjour,

Merci en tout cas pour ton aide je vais regarder encore ce que je peux faire pour améliorer
Je pense que la fonction est la solution à creuser et puis le Filtre que tu ma apporté

Cordialement,

Rechercher des sujets similaires à "power query fichier htm optimiser code"