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...

Amilo

XLDnaute Accro
Re,
VB:
Normalement, il n'ira pas mettre le nez dans PQ.
Il n'y a pas besoin de mettre le nez dans PQ pour faire échouer une requête,
Certains utilisateurs, malgré un code très bien ficelé, arrivent à provoquer des échecs :)
Vous me direz, ceci quelque soit le code utilisé.

Sinon, j'avais compris que vous vouliez en même temps apprendre davantage sur PQ.
Dans vos messages, j'ai cru comprendre que vous vouliez aussi faire "Simple".
Un code à rallonge est tout sauf simple. ;)
Comme tout le monde le sait, "Simple" c'est le plus compliqué à faire. :)

Cordialement
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

@Amilo
Personnellement pour ma gouverne et ma curiosité, je peux me permettre rallonge et digressions.
Donc ca ne me dérange pas de faire des essais/erreurs
et surtout de découvrir les propositions des membres du forum. ;)

Pour ce qui est du fichier XLSX avec requête PQ, une fois finalisé et livré à son destinataire, je suis censé ne plus m'en occuper ensuite.

Comme ce fichier lui servira dans son boulot, il n'a pas aucun intérêt à y mettre le souk

Demain je testerai sur le fichier réel la proposition d'@alexga78
(qui reprend ton idée d'un tableau structuré servant de paramètres pour le choix des colonnes)
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil


J'ai testé le dernier fichier d'@alexga78 avec un fichier CSV du boulot.
Il y a juste un problème pour les colonnes de type date
Les dates sont inversées (jj/mm/aaaa devient mm/jj/aaaa)
et avec des dates comme 17/01/2024, ca renvoie une erreur évidemment ( 01/17/2024)

PS: j'ai mis au préalable type date dans le tableau structuré pour DATES et ITEM_2

Bizarrement, je fais une requête avec l'assistant dans ce fichier, PQ indique
PowerQuery:
#"Type modifié" = Table.TransformColumnTypes(#"En-têtes promus",{{"DATES", type text}, {"ITEM_1", type text}, {"ITEM_2", type text}, {"ITEM_3", type text}, {"ITEM_4", Int64.Type}, {"ITEM_5", Int64.Type}, {"ITEM_6", Int64.Type}, {"ITEM_7", Int64.Type}, {"ITEM_8", Int64.Type}})
Et les colonnes dates sont ici en Standard dans Excel quand je fais Fermer et Charger

Par contre, si j ferme Excel, puis que je le réouvre et que depuis un classeur vierge, j'importe de nouveau avec l'Assistant PQ
j'obtiens
PowerQuery:
 #"Type modifié" = Table.TransformColumnTypes(#"En-têtes promus",{{"DATES", type date}, {"ITEM_1", type text}, {"ITEM_2", type date}, {"ITEM_3", type text}, {"ITEM_4", Int64.Type}, {"ITEM_5", Int64.Type}, {"ITEM_6", Int64.Type}, {"ITEM_7", Int64.Type}, {"ITEM_8", Int64.Type}})
Et les colonnes dates sont au format Date dans Excel quand je fais Fermer et Charger.

Est-ce qu'il faut comprendre que si dans une requête PQ, il y a une erreur, les autres requêtes dans ce classeur continuent de générer des erreurs ?
Et que pour éviter cela, il faut fermer et réouvrir Excel (donc PQ) ?

Ci-joint le fichier CSV avec lequel je viens de faire ce test.
 

Pièces jointes

  • test_erreur_dates.zip
    636 bytes · Affichages: 3

alexga78

XLDnaute Occasionnel
Bonsoir JM, le forum,

Le plus simple est d'jouter la Culture "fr-FR" dans la fonction Table.TransformColumnTypes.

étape Result à remplacer par celle ci-desous:

PowerQuery:
= Table.Combine(Table.ReplaceValue(Folder.Files(Table.ToList(Excel.CurrentWorkbook(){[Name="CSV_PATH"]}[Content]){0}), each [Content], each [Name], (x,y,z) => Table.TransformColumnTypes(Table.SelectColumns(Table.AddColumn(Table.PromoteHeaders(Csv.Document(y,null,";",null,TextEncoding.Windows)),"Nom Fichier", each Text.Split(z,"."){0}), Columns{0}),List.Zip({Columns{0}, List.Transform(Columns{1}, Expression.Evaluate)}), "fr-FR"), {"Content"})[Content])

Cordialement,
 

Amilo

XLDnaute Accro
@Staple1600 ,
Vous pouvez vous aider de Power Query Formatter pour formater le code pour une meilleure lecture
Ce qui donnerait :
VB:
Table.Combine(
  Table.ReplaceValue(
    Folder.Files(Table.ToList(Excel.CurrentWorkbook(){[Name = "CSV_PATH"]}[Content]){0}),
    each [Content],
    each [Name],
    (x, y, z) =>
      Table.TransformColumnTypes(
        Table.SelectColumns(
          Table.AddColumn(
            Table.PromoteHeaders(Csv.Document(y, null, ";", null, TextEncoding.Windows)),
            "Nom Fichier",
            each Text.Split(z, "."){0}
          ),
          Columns{0}
        ),
        List.Zip({Columns{0}, List.Transform(Columns{1}, Expression.Evaluate)}),
        "fr-FR"
      ),
    {"Content"}
  )[Content]
)

Cordialement
 

Membres actuellement en ligne

Statistiques des forums

Discussions
313 322
Messages
2 097 141
Membres
106 850
dernier inscrit
benbeckman