Power Query Simplifier/Universaliser l'import multiple de fichiers CSV

Staple1600

XLDnaute Barbatruc
Bonsoir le forum

Je cherche à simplifier l'import de CSV à partir d'un dossier donné.

Quand on utilise l'assistant de PowerQuery, il y a de nombreuses étapes (voir ci-dessous)
PQ_CSV_Capture.PNG


PowerQuery:
let
    Source = Folder.Files("C:\Users\STAPLE\Documents\PQ_CSV"),
    #"Fichiers masqués filtrés1" = Table.SelectRows(Source, each [Attributes]?[Hidden]? <> true),
    #"Appeler une fonction personnalisée1" = Table.AddColumn(#"Fichiers masqués filtrés1", "Transformer le fichier", each #"Transformer le fichier"([Content])),
    #"Colonnes renommées1" = Table.RenameColumns(#"Appeler une fonction personnalisée1", {"Name", "Source.Name"}),
    #"Autres colonnes supprimées1" = Table.SelectColumns(#"Colonnes renommées1", {"Source.Name", "Transformer le fichier"}),
    #"Colonne de tables développée1" = Table.ExpandTableColumn(#"Autres colonnes supprimées1", "Transformer le fichier", Table.ColumnNames(#"Transformer le fichier"(#"Exemple de fichier"))),
    #"Type modifié" = Table.TransformColumnTypes(#"Colonne de tables développée1",{{"Source.Name", type text}, {"ITEM_1", Int64.Type}, {"ITEM_2", Int64.Type}, {"ITEM_3", Int64.Type}, {"ITEM_4", Int64.Type}, {"ITEM_5", Int64.Type}, {"ITEM_6", Int64.Type}, {"ITEM_7", Int64.Type}, {"ITEM_8", Int64.Type}})
in
    #"Type modifié"
On peut faire plus simple et générique que Microsoft, non ?

Quelqu'un aurait-il un code M plus synthétique et universel(*) pour faire cette opération ?
(*) notamment ici #"Type modifié" : ne pas avoir à lister tous les noms des colonnes

PS: j'ai regardé sur le forum les discussions avec le préfixe PowerQuery, j'ai regardé quelques vidéos sur YT (mais c'est pas pratique) et enfin je n'ai pas solliciter ChatGPT, préférant mes frères humains (notamment ceux d'XLD) et aussi un peu en souvenir de Sarah Connor. ;)

NB: Il me semble que les étapes de Microsoft sont peu ou prou ce que montrent cette vidéo, non ?
https://www.youtube.com/watch?app=desktop&v=IsLB3XR9eno
 
Solution
Re,

@alexga78
j'utilise aussi Office 365

Les fichiers de test CSV sont issus d'Excel (Enregistrer sous -> CSV, séparateur point virgule)

Tu as essayé avec les fichiers contenu dans le zip du message#2 ?

Tu peux mettre ton code M complet, stp avec le let .... in
merci

Sinon tu vois comment simplifier le code "anglophone" ?

Re,
les fichiers testés sont ceux du zip.

un autre essai pour le nom des fichiers

PowerQuery:
let
    Source = Folder.Files("C:\Users\STAPLE\Documents\PQ_CSV"),
    Result = let x =  Table.SelectColumns(Table.AddColumn(Source, "Custom", each Table.PromoteHeaders(Csv.Document([Content],[Delimiter=";", Encoding=TextEncoding.Windows, QuoteStyle=QuoteStyle.None]))),{"Name","Custom"}) in Table.ExpandTableColumn(x,"Custom", List.Union(Table.TransformColumns(x, {"Custom", each...

Staple1600

XLDnaute Barbatruc
Re

Ah la casse !!!
Ca casse PQ ! ;)

Comme ceci c'est OK
(j'ai aussi modifié la dernière ligne après le in, sinon les données restaient en texte.
PowerQuery:
let
    Source_Colonnes = Excel.CurrentWorkbook(){[Name="ListColonnes"]}[Content],
    Source = Folder.Files("C:\Users\STAPLE\Documents\PQ_CSV"),
    Personnalisé1 = Source[[Folder Path],[Name]],
    #"Personnalisée ajoutée" = Table.AddColumn(Source, "Personnalisé", each  Table.PromoteHeaders(Csv.Document(File.Contents([Folder Path] & [Name]), null, ";", 1 , 1252))),
    #"Personnalisée ajoutée1" = Table.AddColumn(#"Personnalisée ajoutée", "Personnalisé.1", each Table.AddColumn([Personnalisé], "Nom fichier", (x)=> [Name])),
    #"Personnalisée ajoutée2" = Table.AddColumn(#"Personnalisée ajoutée1", "Personnalisé.2", each Table.SelectColumns([Personnalisé.1], Table.Column(Source_Colonnes, "Liste Colonnes"))),
    Personnalisé2 = Table.Combine(#"Personnalisée ajoutée2"[Personnalisé.2]),
    Personnalisé3 = Table.TransformColumns(Personnalisé2, {"Nom fichier", each _}, Number.From)

in
    Personnalisé3
Merci encore

Donc en résumer, on importe tout dans PQ et on supprime et/ou sélectionne des colonnes ensuite.
Je pensais qu'on pouvait choisir les colonnes à l'importation et avant de charger les données dans une feuille Excel
 

Amilo

XLDnaute Accro
Re,
Je ne sais pas si c'est possible mais ce que je sais c'est que pour les modèles de données (Power Pivot), il faut importer de préférence les colonnes nécessaires, (de PQ vers Power Pivot).
Sinon, j'ai un autre code qui travail directement dans la colonne "Binary" sans passer par les 3 colonnes supplémentaires de "Tables"
Je pense que c'est trop manuel et plutôt difficile à comprendre
Et pas évident pour la maintenance du code en cas d'erreur

Edit : exact, je n'avais pas mis à jour le nom de la dernière l'étape après le in
Sinon, peut-être que ChatGPT pourrait proposer des noms pour des étapes et ajouter des commentaires plus parlants

Cordialement
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

@Amilo
Sinon, j'ai un autre code qui travail directement dans la colonne "Binary" sans passer par les 3 colonnes supplémentaires de "Tables"
Je pense que c'est trop manuel et plutôt difficile à comprendre
Et pas évident pour la maintenance du code en cas d'erreur
Ce n'est pas un souci ;)
C'est toujours intéressant de découvrir de nouvelles choses dans PQ.
Si tu as ce code sous la main, n'hésites pas à le publier ;)
 

Amilo

XLDnaute Accro
Re,
Pour l'instant cela donnerait ça mais je ne suis pas allé jusqu'au bout,
VB:
let
    Source_Colonnes = Excel.CurrentWorkbook(){[Name="ListColonnes"]}[Content],
    Source=Folder.Files("C:\Users\STAPLE\Documents\PQ_CSV"),
    #"Autres colonnes supprimées" = Table.SelectColumns(Source,{"Content"}),
    Personnalisé1 = List.Transform(Folder.Files("C:\Users\STAPLE\Documents\PQ_CSV")[Content], each Table.SelectColumns(Table.PromoteHeaders(Csv.Document(_, [Delimiter=";", Encoding=TextEncoding.Windows, QuoteStyle=QuoteStyle.None])), Table.Column(Source_Colonnes, "Liste Colonnes")))
in
    Personnalisé1

Bonne nuit

Cordialement
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil

=> Pour confirmation
J'ai retesté plusieurs propositions du fil qui font l'import sans passer par l'Assistant PQ
L'import se fait bien mais ce qui est renvoyé dans Excel est du texte

Avec les CSV originaux, quand je passe par l'Assistant, les données sont correctement détectées puis chargées dans Excel
(Les dates sont des dates, les nombres des nombres et les textes sont en Standard.

Ce qui voudrait dire qu'il serait plus simple de passer par l'assistant ?
(au moins pour l'importation)
 

Staple1600

XLDnaute Barbatruc
Bonsoir @Cousinhub

Au départ, je voulais simplifier (cf message#1)
Faire un import de plusieurs CSV avec un code M minimal (sans passer par l'Assistant)

Les différents code M proposés font cet "import simplifié" sauf que quand je fais Fermer et Charger, toutes les colonnes sont en texte dans Excel.

Ici codede l'assistant pour un fichier CSV
PowerQuery:
let
    Source = Csv.Document(File.Contents("C:\Users\STAPLE\Documents\PQ_CSV\Test01.csv"),[Delimiter=";", Columns=8, Encoding=1252, QuoteStyle=QuoteStyle.None]),
    #"En-têtes promus" = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
    #"Type modifié" = Table.TransformColumnTypes(#"En-têtes promus",{{"ITEM_1", Int64.Type}, {"ITEM_2", Int64.Type}, {"ITEM_3", Int64.Type}, {"ITEM_4", Int64.Type}, {"ITEM_5", Int64.Type}, {"ITEM_6", Int64.Type}, {"ITEM_7", Int64.Type}, {"ITEM_8", Int64.Type}})
in
    #"Type modifié"

Donc sur mon CSV réel, j'importe avec une des syntaxes simplifiées et j'ajoute cette dernière étape #"Type modifié" et PQ fera le typage des colonnes tout seul (dates/nombres/texte) ?
 

Cousinhub

XLDnaute Barbatruc
Inactif
Re-,
Si toutes les colonnes sont à modifier en Int64, tu peux essayer ce code : (non testé)
PowerQuery:
ModType = Table.TransformColumnTypes(#"En-têtes promus", List.Transform(Table.ColumnNames(#"En-têtes promus"), each {_, Int64.Type}))

Peut-être?
 

Staple1600

XLDnaute Barbatruc
Bonsoir @alexga78

Pour du concis, c'est du concis ;)

Il y a des truc que je connais et d'autres où il va falloir que je me creuse les méninges
Text.Split
List.Zip
Expression.Evaluate

Bravo en tout cas pour ce code M ciselé.

@Cousinhub
Non, dans les fichiers originaux, il y des différents types de colonnes.

Demain au taf, je ferai une copie de la structure des 29 colonnes du CSV
et je posterai un fichier CSV exemple ici.
 

Staple1600

XLDnaute Barbatruc
Re

Je viens de faire ce test avec l'assistant avec le fichier CSV joint.
Code:
let
    Source = Csv.Document(File.Contents("C:\Users\STAPLE\Documents\PQ_CSV\Test05.csv"),[Delimiter=";", Columns=8, Encoding=1252, QuoteStyle=QuoteStyle.None]),
    #"En-têtes promus" = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
    #"Type modifié" = Table.TransformColumnTypes(#"En-têtes promus",{{"ITEM_1", type text}, {"ITEM_2", type date}, {"ITEM_3", type date}, {"ITEM_4", type number}, {"ITEM_5", type number}, {"ITEM_6", type number}, {"ITEM_7", type text}, {"ITEM_8", type text}})
in
    #"Type modifié"

Partant de là, il me restera en reprenant l'exemple d'@alexga78 d'indiquer dans la colonne Type de ListColonnes les types correspondant aux colonnes à importer.
 

Pièces jointes

  • Test05.zip
    371 bytes · Affichages: 2

Amilo

XLDnaute Accro
Bonsoir à tous,
@Staple1600 , voici mon point de vue,
Lors de la fusion, l'assistant PQ génère une multitude de requête dans le dossier d'assistance dans le genre de votre message #1 et souvent déroutant pour le néophyte,

Il créé également toutes les étapes jusqu'à l'étape "type modifié".
Et si la table n'a pas besoin d'autres transformations, je dirais que c'est le plus simple à faire.
Mais généralement dans la plupart des cas, d'autres transformations s'avèrent nécessaires pour obtenir le résultat souhaité.

Ceux qui ne maitrisent pas PQ auront tendance à faire les transformations dans la requête finale alors qu'il est conseillé de les faire dans celle nomée "Transformer l'exemple de fichier"

Il y a de nombreux outils de transformations dans le Ruban facile à effectuer et qui ne posent pas de problème de performance.

Pour ce qui est d'une fusion manuelle sans passer par l'assistant PQ, il n'y a qu'une seule requête et quelques étapes à ajouter dont le typage des données.
Cette dernière étape peut se faire également en passant par l'onglet "Transformer" du ruban "Détecter les types de données"

A mes débuts, j'ai commencé par l'assistant PQ puis une fois plus à l'aise, je passe désormais plutôt par des requêtes manuelles

Le choix, pour ce cas, dépend de ses propres préférences et du niveau de compétences.
Au niveau performance, je pense qu'on devrait pas voir de différence entre les 2 méthodes

Edit : il est tout à fait possible d'imbriquer les étapes que j'avais proposées dans mes précédents messages pour n'avoir qu'une seule à rallonge, mais bon courage à celui qui voudra modifier par la suite.
C'est comme les formules Excel, vaut mieux 3 ou 4 intermédiaires, qu'une seule longue comme le bras.

Cordialement
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonsoir @Amilo

Je ne suis que le créateur du fichier qui combine les CSV

L'utilisateur final lui n'utilisera que le TCD réalisé à partir des données issues des CSV et rapatriées par PQ.

Normalement, il n'ira pas mettre le nez dans PQ.

Moi, je me contente, chaque mois, de déposer le nouveau CSV dans le dossier dédié.

Ensuite, roule ma poule ;)

PS: J'ai expliqué à l'utilisateur final qu'il n'oublie pas de faire Actualiser tout avant d'utiliser le TCD

NB: Le but pour moi était de me perfectionner dans PQ, notamment découvrir plus avant le code M
De ce coté là avec toutes vos propositions, j'ai de quoi faire.
Merci encore ;)

PS: Aux PQristes de ce fil
Si le cœur vous en dit, l'aventure de ce fichier se poursuit dans cette discussion que je viens d'ouvrir.
 

Statistiques des forums

Discussions
315 105
Messages
2 116 257
Membres
112 704
dernier inscrit
zanda19