Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 Délimiteur Power Query

Derrdio

XLDnaute Nouveau
Bonjour à tous,

J'ai un problème sur l'utilisation de Power Query. J'ai plusieurs fichiers .txt dans un dossier, je fais donc "obtenir des données" puis "A partir d'un fichier" puis "A partir d'un dossier" et pour finir "Combiner et transformer les données". Et voila le problème sur la photo ci-dessous. Il me met toutes les données de mon fichier les une en dessous des autres et je n'ai pas la possibilité de mettre en place un délimiteur pour les transformer en colonne.



Avez-vous une solution pour avoir une colonne propre pour chaque données et que pour chaque nouveau fichier ca s'affiche en dessous ?

Voici deux fichiers anonymes pour y voir plus clair.

Merci d'avance
 

Pièces jointes

  • BON_RECEPTION_2023-10-10_14_09_00_FCK343475_LORRAINE_NORD_-_LORRAINE_ENTREPRISES_DT921MY_EDF_-...txt
    997 bytes · Affichages: 12
  • BON_RECEPTION_2023-10-27_12_32_00_FCK345176_LORRAINE_NORD_-_LORRAINE_ENTREPRISES_GL969RX_METZGER.txt
    1.4 KB · Affichages: 8
Solution
Bonjour Derrdio, Cousinhub, le forum,

Ci-dessous une autre approche qui suppose que la structure des fichiers texte est constante (que "les infos sont à récupérer toujours aux même lignes").
Il faut adapter l'emplacement du dossier contenant tous les bons de réceptions à la première étape PathDossiersBR :
PowerQuery:
let
    PathDossiersBR = "C:\...\BR",

    fnExtractTxtInfo = (txtBinary as binary) as record =>
        let
            ExtractTxt = Csv.Document(txtBinary,[Delimiter="~", Columns=1, Encoding=1252, QuoteStyle=QuoteStyle.None]),
            SupprEspaces = Table.TransformColumns(ExtractTxt,{{"Column1", Text.Trim, type text}}),
            ExtratTxtInfos = let txtLines = SupprEspaces[Column1] 
                in [#"N° Bon de pesée"=txtLines{17}, 
                    #"Nom du...

Cousinhub

XLDnaute Barbatruc
Bonjour,
Pour essayer (je dis bien "essayer") de comprendre le besoin, peux-tu mettre un txt "vierge", ne comprenant que les en-têtes voulus (précédés d'un astérisque), et mettre toutes (je dis bien "toutes") les données susceptibles d'y apparaître précédées d'un @, par exemple :

*Date et heure
*Site
*N° bon d’intervention
*N°Dossier

@Date et heure
@Site
@N° bon d’intervention
@N°Dossier


1 – GENERALITE
*Nom du client
@nom du client (est-ce une donnée possible? - vide dans tes exemples...)
*Nom du producteur
@nom du producteur
...
...

Juste histoire de voir si cela est possible, ou du moins, à mon niveau...
@ te relire
 

Derrdio

XLDnaute Nouveau
Merci pour la réponse. Je pense qu'une image vaut mille mots alors voici le résultat attendu :

Effectivement, il y a un nom du producteur mais pour des raisons de confidentialité je ne pourrais pas en donner.
Les liens sont générés via un code VBA donc ne pas s'y soucier.
Je faisais actuellement cette tache d'importation avec un code VBA mais c'était très long, je pense gagner du temps avec PQ.
 

Cousinhub

XLDnaute Barbatruc
Re-,
Voici un premier jet.
Dans l'onglet "Paramètre", la cellule A1 est nommée "Dossier", et tu y mets l'adresse du répertoire comportant tes fichiers "Txt".
Puis dans l'onglet "Recap", clic droit dans la requête, "Actualiser" (ou ruban Données/Actualiser tout)
Si ça te va...
PS, j'ai compris "nom du producteur" et pas "nom du client"
 

Pièces jointes

  • PQ_Combiner txt.xlsx
    22 KB · Affichages: 5

Derrdio

XLDnaute Nouveau
Merci pour le retour.
Je dois m'absenter, je vois ca jeudi et je fais un retour.
 

mromain

XLDnaute Barbatruc
Bonjour Derrdio, Cousinhub, le forum,

Ci-dessous une autre approche qui suppose que la structure des fichiers texte est constante (que "les infos sont à récupérer toujours aux même lignes").
Il faut adapter l'emplacement du dossier contenant tous les bons de réceptions à la première étape PathDossiersBR :
PowerQuery:
let
    PathDossiersBR = "C:\...\BR",

    fnExtractTxtInfo = (txtBinary as binary) as record =>
        let
            ExtractTxt = Csv.Document(txtBinary,[Delimiter="~", Columns=1, Encoding=1252, QuoteStyle=QuoteStyle.None]),
            SupprEspaces = Table.TransformColumns(ExtractTxt,{{"Column1", Text.Trim, type text}}),
            ExtratTxtInfos = let txtLines = SupprEspaces[Column1] 
                in [#"N° Bon de pesée"=txtLines{17}, 
                    #"Nom du producteur"=txtLines{14}, 
                    Immatriculation=txtLines{20}, 
                    Désignation=txtLines{33},
                    #"Code déchet"=txtLines{37},
                    Humidité=txtLines{41},
                    Conformité=txtLines{52}]
        in
            ExtratTxtInfos,

    FichierDuDossier = Folder.Files(PathDossiersBR),
    AjoutColonnePathFichier = Table.AddColumn(FichierDuDossier, "Path", each Text.Combine({[Folder Path], [Name]}, ""), type text),
    ColonnesSélectionnées = Table.SelectColumns(AjoutColonnePathFichier,{"Path", "Name", "Content"}),
    ExtractTxtInfos = Table.TransformColumns(ColonnesSélectionnées,{{"Content", fnExtractTxtInfo, type record}}),
    DevelopTxtInfos = Table.ExpandRecordColumn(ExtractTxtInfos, "Content", {"N° Bon de pesée", "Nom du producteur", "Immatriculation", "Désignation", "Code déchet", "Humidité", "Conformité"}, {"N° Bon de pesée", "Nom du producteur", "Immatriculation", "Désignation", "Code déchet", "Humidité", "Conformité"})

in
    DevelopTxtInfos

Par contre, je n'ai pas compris où récupérer l'information Immatriculation. Ici, j'ai supposé qu'elle était en ligne 21. Il faudra donc peut-être adapter la ligne Immatriculation=txtLines{20}.

A+
 

merinos

XLDnaute Accro
Bonjour @Derrdio
Et je n'oublie pas @Cousinhub , @mromain et tout le fofo


j'importe les 2 fichier avec une table de correspondance par lignes... Seules les lignes mentionnées dans le tableau seront conservées

il y a un paramettre: l'endroit où sont stocké les fichiers
 

Pièces jointes

  • import bons de commande.xlsx
    32.6 KB · Affichages: 8

Derrdio

XLDnaute Nouveau
Bonjour @Cousinhub @mromain @merinos et le forum,

@mromain, le code fonctionne parfaitement et permet un gain de temps juste inimaginable, merci beaucoup. Est-ce que si je mets des fichiers autres que des txt dans le dossier ca posera problème ou alors le code se concentre sur les txt seulement ?

@Cousinhub @merinos, merci pour vos retours également. Au vue de la simplicité de mise en place du code de @mromain, vous ne m'en voudrez pas si je pars la dessus.

Encore merci pour votre aide
 

mromain

XLDnaute Barbatruc
Bonjour Derrdio, Cousinhub, merinos et le forum,

Est-ce que si je mets des fichiers autres que des txt dans le dossier ca posera problème ou alors le code se concentre sur les txt seulement ?
Actuellement, le code "suppose" qu'il n'y a que des fichiers texte à traiter dans le dossier.
Il faut ajouter une étape de filtre après l'étape FichierDuDossier :
  1. sélectionner l'étape FichierDuDossier ;
  2. ajouter un filtre sur les extensions de type .txt.

Tu peux aussi filtrer sur le nom des fichiers suivant ton contexte.

A+
 

Derrdio

XLDnaute Nouveau
C'est parfait, merci beaucoup !
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…