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

j'ajoute des fichiers CSV exemple comme c'est l'usage

Et deux macros en prime, si vous voulez générer vous-même les exemples ;)
VB:
Sub MacroO365()
Range("A2").Formula2 = "=RANDARRAY(50,8,5,125,TRUE)"
Range("A1:H1") = Array("ITEM_1", "ITEM_2", "ITEM_3", "ITEM_4", "ITEM_5", "ITEM_6", "ITEM_7", "ITEM_8")
End Sub
Sub Macro()
Range("A2:H51").FormulaR1C1 = "=RANDBETWEEN(5,125)"
Range("A1:H1") = Array("ITEM_1", "ITEM_2", "ITEM_3", "ITEM_4", "ITEM_5", "ITEM_6", "ITEM_7", "ITEM_8")
End Sub

En espérant que cela attire les PowerQueristes du forum ;)
 

Pièces jointes

  • PQ_CSV.zip
    1.4 KB · Affichages: 11

alexga78

XLDnaute Occasionnel
Bonjour Staple1600,

un essai pour la combinaison des fichiers csv si j'ai bien compris.

PowerQuery:
= Table.Combine(Table.AddColumn(Folder.Files("C:\Users\STAPLE\Documents\PQ_CSV"), "Custom", each Table.PromoteHeaders(Csv.Document([Content],null,";")))[Custom])

Cordialement,
 

Staple1600

XLDnaute Barbatruc
Bonjour alexga78, le fil

Merci pour ta proposition
Ci-dessous le résultat obtenu
test_Alexga78.PNG

avec ce code M
PowerQuery:
let
#"test"= Table.Combine(Table.AddColumn(Folder.Files("C:\Users\STAPLE\Documents\PQ_CSV"), "Custom", each Table.PromoteHeaders(Csv.Document([Content],null,";")))[Custom])
in
#"test"

De mon côté, je suis arrivé ici de mes essais
(code original glané sur le web anglophone)
PowerQuery:
let
    Source = Folder.Files("C:\Users\STAPLE\Documents\PQ_CSV"),
#"Filtered Rows" = Table.SelectRows(Source, each [Extension]=".csv"),
#"Added Custom" = Table.AddColumn(#"Filtered Rows", "Custom", each Table.PromoteHeaders(Csv.Document([Content],[Delimiter=";", Encoding=1252, QuoteStyle=QuoteStyle.None]))),
#"Removed Other Columns" = Table.SelectColumns(#"Added Custom",{"Custom"}),
#"Expanded Custom" = Table.ExpandTableColumn(#"Removed Other Columns", "Custom", Table.ColumnNames(Table.Combine(#"Removed Other Columns"[Custom])),Table.ColumnNames(Table.Combine(#"Removed Other Columns"[Custom])))
in
#"Expanded Custom"
Ce qui donne ce résultat

Test_JM.PNG

PowerQuery:
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re,

@alexga78
Bizarrement, si je suis ton exemple, je retrouve des scories comme dans ta proposition, avec d'autres en bonus
code M testé
PowerQuery:
let
#"Added Custom" = Table.AddColumn(Folder.Files("C:\Users\STAPLE\Documents\PQ_CSV"), "Custom", each Table.PromoteHeaders(Csv.Document([Content],[Delimiter=";", Encoding=1252, QuoteStyle=QuoteStyle.None]))),
#"Removed Other Columns" = Table.SelectColumns(#"Added Custom",{"Custom"}),
#"Expanded Custom" = Table.ExpandTableColumn(#"Removed Other Columns", "Custom", Table.ColumnNames(Table.Combine(#"Removed Other Columns"[Custom])),Table.ColumnNames(Table.Combine(#"Removed Other Columns"[Custom])))
in
#"Expanded Custom"

test2_JMG.PNG

Qu'est-ce qui faudrait ajouter dans ton "one-liner" pour éviter les scories ?

PS: Il faudrait que le nom des fichiers CSV apparaissent dans la 1ere colonne

EDITION: Solution trouvée pour avoir les noms des fichiers avec cette modification sur #"Removed Other Columns"
Table.SelectColumns(#"Added Custom",{"Name","Custom"})
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
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" ?
 

alexga78

XLDnaute Occasionnel
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 Table.ColumnNames(_)})[Custom]))
in
    Result
 

Pièces jointes

  • Book11.xlsx
    25.7 KB · Affichages: 7
  • 1.png
    1.png
    83.6 KB · Affichages: 8

Staple1600

XLDnaute Barbatruc
Re

@alexga78
En détaillant ta syntaxe étape par étape, je n'ai plus de scories
PowerQuery:
let
Source = Folder.Files("C:\Users\STAPLE\Documents\PQ_CSV"),
#"FiltreCSV" = Table.SelectRows(Source, each [Extension]=".csv"),
#"CompilerCSV" = Table.Combine(Table.AddColumn(#"FiltreCSV", "Custom", each Table.PromoteHeaders(Csv.Document([Content],[Delimiter=";"])))[Custom])
in
#"CompilerCSV"
Je ne comprends pas pourquoi

je vais voir et tester de ce pas ta nouvelle proposition
 

Staple1600

XLDnaute Barbatruc
Re

@alexga78
merci pour cette dernière proposition
J'ai du la modifié ainsi sinon à nouveau des scories (et le *.zip présent dans le dossier apparaissait)
PowerQuery:
let
    Source = Folder.Files("C:\Users\STAPLE\Documents\PQ_CSV"),
    FichiersCSV = Table.SelectRows(Source, each [Extension]=".csv"),
    Result = let x =  Table.SelectColumns(Table.AddColumn(FichiersCSV, "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 Table.ColumnNames(_)})[Custom]))
in
    Result
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonjour @Cousinhub

Ma version d'Excel
Version 2403 (build 17425.20176)
Windows 10


Question:
Comment on peut savoir la version de PowerQuery ?

PS: Tu voulais dire tous les autres code M du fil , @alexga78 n'en ayant publié que deux (messages #3 et #8 ) ;)

Et toi, ton code M ressemblerait à quoi pour faire cette compilation de CSV ? ;)
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
[aparté]
Je viens de voir que mon Windows veut mettre à jour
2024-04 Mise à jour cumulative de .NET Framework 3.5, 4.8 et 4.8.1 Windows 10 Version 22H2 pour x64 (KB5037036)
Je fais la mise à jour et je regarde si les scories sont toujours là

Sinon en cherchant, des infos sur PowerQuery, je suis tombé sur ceci
Power Query dépréciation du complément

Au début de l’été 2019, nous avons officiellement déprécié le complément Power Query requis pour Excel 2010 et 2013 pour Windows. Par courtoisie, vous pouvez toujours utiliser le complément, mais cela peut changer à une date ultérieure.
Ils ont une drôle de manière d'être courtois chez Microsoft !
[aparté]
 

Statistiques des forums

Discussions
315 105
Messages
2 116 255
Membres
112 702
dernier inscrit
JRCa91