Power query fichier .htm optimiser code
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 FormatNombreEn 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 :
Avec Table.FromPartitions :
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
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.
@+
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 FormatNombreCordialement,
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
ColSuppMerci 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
RemoveErrorsOn 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
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,