Forum Discussion
Keep "Source.name" after expanding Binary
- 1 year ago
Hi ,Thank you for reaching out to Microsoft Fabric Community Forum.
Ensure that the Source.Name column is added before expanding the PDF content. This step is crucial to maintain the relationship between the source file and the extracted data after expansion. After expanding the PDF content, you should ensure the Source.Name column is preserved and added back if necessary.
Here’s a modified version of your query to maintain Source.Name throughout the process:
let// Récupérer les fichiers du dossier
Source = Folder.Files("C:\ETAT DES TOURNEES DU 2024"),
// Filtrer les fichiers cachés
#"Fichiers masqués filtrés1" = Table.SelectRows(Source, each [Attributes]?[Hidden]? <> true),
// Appeler une fonction personnalisée sur les fichiers
#"Appeler une fonction personnalisée1" = Table.AddColumn(#"Fichiers masqués filtrés1", "Transformer le fichier", each #"Transformer le fichier"([Content])),
// Renommer la colonne Name en Source.Name
#"Colonnes renommées1" = Table.RenameColumns(#"Appeler une fonction personnalisée1", {"Name", "Source.Name"}),
// Ajouter la colonne Source.Name avant d'importer le PDF
#"Ajouté Source.Name dans le tableau" = Table.AddColumn(#"Colonnes renommées1", "Source.Name", each [Source.Name]),
// Accéder aux tables PDF
#"Tables PDF" = Table.AddColumn(#"Ajouté Source.Name dans le tableau", "Tables", each Pdf.Tables([Content])),
// Développer les tables PDF
#"Tables développées" = Table.ExpandTableColumn(#"Tables PDF", "Tables", {"Column1", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7"}, {"Column1", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7"}),
// Ajouter Source.Name à chaque ligne après expansion
#"Source.Name ajouté après expansion" = Table.AddColumn(#"Tables développées", "Source.Name", each [Source.Name]),
// Modifier les types de données pour les colonnes
#"Type modifié" = Table.TransformColumnTypes(#"Source.Name ajouté après expansion",{{"Source.Name", type text}, {"Column1", type text}, {"Column2", type text}, {"Column3", type text}, {"Column4", type text}, {"Column5", type text}, {"Column6", type text}, {"Column7", type text}}),
// Remplir les valeurs vers le bas pour la colonne "Column1"
#"Rempli vers le bas" = Table.FillDown(#"Type modifié",{"Column1"}),
// Filtrer les lignes où Column1 n'est pas null
#"Lignes filtrées" = Table.SelectRows(#"Rempli vers le bas", each ([Column1] <> null)),
// Ajouter la colonne "Personnalisé" en fonction des conditions
#"Personnalisée ajoutée" = Table.AddColumn(#"Lignes filtrées", "Personnalisé", each if ([Column2] = null or [Column2] = "") and [Column3] <> null and [Column3] <> "" then [Column1] else null),
// Remplir vers le bas pour la colonne Personnalisé
#"Rempli vers le bas1" = Table.FillDown(#"Personnalisée ajoutée",{"Personnalisé"}),
// Réorganiser les colonnes
#"Colonnes permutées" = Table.ReorderColumns(#"Rempli vers le bas1",{"Source.Name", "Column1", "Personnalisé", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7"}),
// Supprimer la colonne Column2
#"Colonnes supprimées" = Table.RemoveColumns(#"Colonnes permutées",{"Column2"}),
// Ajouter la colonne "A supprimer" en fonction des conditions
#"Personnalisée ajoutée1" = Table.AddColumn(#"Colonnes supprimées", "A supprimer", each if ([Column1] = [Personnalisé]) then "Oui" else "Non"),
// Filtrer les lignes à ne pas supprimer
#"Lignes filtrées2" = Table.SelectRows(#"Personnalisée ajoutée1", each ([A supprimer] = "Non") and ([Column3] <> null) and ([Column4] <> "PROCEDURE DE#(lf)L'ETAT DE TOURNEE")),
// Remplacer les valeurs dans Source.Name
#"Valeur remplacée" = Table.ReplaceValue(#"Lignes filtrées2","-","",Replacer.ReplaceText,{"Source.Name"}),
// Ajouter la colonne Personnalisé.1 pour extraire la date
#"Personnalisée ajoutée2" = Table.AddColumn(#"Valeur remplacée", "Personnalisé.1", each Date.FromText(Text.Select([Source.Name], {"0".."9"} ), [Format="ddMMyyyy", Culture="fr-FR"])),
// Remplir les valeurs vers le bas pour Personnalisé.1
#"Rempli vers le bas2" = Table.FillDown(#"Personnalisée ajoutée2",{"Personnalisé.1"}),
// Supprimer les erreurs
#"Erreurs supprimées" = Table.RemoveRowsWithErrors(#"Rempli vers le bas2", {"Personnalisée ajoutée2"}),
// Modifier le type de la colonne Personnalisé.1
#"Type modifié1" = Table.TransformColumnTypes(#"Erreurs supprimées",{{"Personnalisée.1", type date}}),
// Remplacer les valeurs dans les colonnes
#"Valeur remplacée1" = Table.ReplaceValue(#"Type modifié1",".","",Replacer.ReplaceText,{"Column5", "Column6", "Column7"}),
// Ajouter la colonne "Tonnage" selon des conditions spécifiques
#"Personnalisée ajoutée3" = Table.AddColumn(#"Valeur remplacée1", "Tonnage", each let
textCol5 = Text.Remove(Text.From([Column5]), {"0".."9", ",", " "})),
// Ajouter la colonne "Suite client"
#"Personnalisée ajoutée4" = Table.AddColumn(#"Personnalisée ajoutée3", "Suite client", each let
textCol5 = Text.Remove(Text.From([Column5]), {"0".."9", ",", " "})),
// Ajouter la colonne "Commentaire"
#"Personnalisée ajoutée5" = Table.AddColumn(#"Personnalisée ajoutée4", "Commentaire", each let
textCol5 = Text.Remove(Text.From([Column5]), {"0".."9", ",", " "}))
in
#"Personnalisée ajoutée5"
If this helps, please mark it ‘Accept as Solution’, so others with similar queries may find it more easily. If not, please share the details.
Hi medmbchr1989
This specific applies steps drills down into a specific pdf file which makes the other columns disappear
// Accéder au fichier PDF spécifique
#"C:\Users\moham\talan com\GRP-Zalar Holding - General\3_Données client\Eldin-BMA - Dossier collecte de données client\Données Hors SAP\Banchereau\ETAT DES TOURNEES DU 2024\_13-08-2024 pdf" = #"Colonnes renommées1"{[#"Folder Path"="C:\Users\moham\talan.com\GRP-Zalar Holding - General\3_Données client\Eldin-BMA - Dossier collecte de données client\Données Hors SAP\Banchereau\ETAT DES TOURNEES DU 2024\",Source.Name="13-08-2024.pdf"]}[Content]
Instead, add a custom column that accesses the pdf files. Example:
Pdf.Tables([content])
Expand then column and select only the needed rows. Once the needed rows have been selected, create another custom column which promotes the first row of the tables inside the pdf as the headers. Example:
Table.PromoteHeaders([table column], [PromoteAllScalars = true])
PDFs are tricky to work with as the succeeding pages don't usually have the header information. If this the case for you and assuming the first page contains the header, try:
if [page column] = "page01" //M is case - sensitive
then Table.PromoteHeaders([table column], [PromoteAllScalars = true])
else [table column]
Apply further transformations as necessary.
Hi danextian
I have Pages and Tables in my data, but filtering on Pages only which Pdf.tables can't read
- danextian1 year ago
Super User
Per testing, Power Query can see both kinds
- medmbchr19891 year ago
Helper I
Alright, I have tried another approach by editing the custom function that calls the data, however it gives me only the first page of my pdfs