Cet outil fait suite à celui permettant d'importer un fichier avec séparateur dans un tableau structuré Excel disponible ici : https://excel-downloads.com/resources/cvs2ts-import-csv.1463/
En effet certains progiciels mettent à disposition des fichiers avec des champs de longueur fixe sans séparateur et sans titre de colonne. Ceci est aussi le cas pour certains fichiers issus de Mainframe (site centraux).
Ils peuvent se présenter comme ceci - exemple :
Bien entendu Excel fourni des outils pour effectuer un découpage mais cela reste artisanal. Il y a un bien entendu la solution de lire le fichier texte ligne à ligne en VBA puis effectuer le découpage de l'enregistrement et l'insérer dans les cellules. Ca c'était une des solutions avant PowerQuery.
PowerQuery va donc nous sauver. Faut-il encore le maîtriser ou en avoir quelques connaissances
Cet outil vous simplifie la tâche et il réalise le code M de PowerQuery automatiquement.
Il se présente comme suit :
Cet écran représente la description du fichier donné en exemple plus haut.
Fonctionnement de l'outil
--> Sélection du fichier à traiter
--> Le nom du fichier en sortie est calculé automatiquement
Après avoir sélectionner à traiter il est obligatoire de décrire sa structure :
- Nom des champs
- Longueur
comme suit
La colonne [POS] est calculée automatiquement en fonction de la longueur du champ saisie via cette formule =SI($B15="LONGUEUR";0;B15+C15). Le noms des champs doivent fournis dans l'ordre selon l'enregistrement se trouvant dans le fichier.
Egalement il peut y avoir des enregistrements de contrôles (en-tête, en-queue) [produits par les mainframe en général] et nous n'avons pas besoin. Si tel est le cas cochez ces options
Ces enregistrements seront supprimés par requête PowerQuery.
Dès la description du fichier effectuée il est nécessaire de lancer les traitement PowerQuery afin de récupérer le fichier dans l'onglet
.
Les traitements PowerQuery sont lancés par
et voici le résultat
Ensuite deux modes d'utilisation :
- soit on conserve l'outil en l'état et vous nommez le fichier sous un autre nom puis vous traitez vos données préparées dans l'onglet RQ_IMPORT_CSV_FB
- soit vous exporter le contenu de cet onglet dans le fichier en sortie qui a été calculé au moment de la sélection
Dans le cas de l'option 2 il faudra activer
choisir
Si le fichier est déjà présent
Résultat :
Résultat du fichier produit
PowerQuery : comment ?
TB_DESCRIPEUR
Au moment de l'importation PowerQuery attribue des noms de champs par défaut (Column1...n)
Cette table les calcule automatiquement via la colonne Index afin de procéder au renommage dans la requête RQ_IMPORT_CSV_FB
let
// Table où on retrouve la description de l'enregistrement avec les noms de champs et les longueurs de chacun
TB_DESC = TB_DESCRIPTEUR,
// On récupère la position de chaque champs dans le tableau descripteur d'enregistrement
L_POSITIONS = TB_DESC[POS],
// On récupère le nombre de champs que comporte l'enregistrement
NB_COL=Table.RowCount(TB_DESC),
// On récupère le nom du fichier à importer
FILENAME = getParameters("TB_PARAMS","PARAM_FICHIER_INPUT"),
// Ligne de contrôle
CTRL_TETE = getParameters("TB_PARAMS","PARAM_LIGNE_CONTROLE_TETE"),
CTRL_QUEUE = getParameters("TB_PARAMS","PARAM_LIGNE_CONTROLE_QUEUE"),
Source = Csv.Document(File.Contents(FILENAME),NB_COL,L_POSITIONS,ExtraValues.Ignore,1252),
// Via la table Descripteur on construit la liste {[ancien nom de champ], [nouveau nom de champ]}
// Par défaut les noms de champs sont nommés Column1 à Column(n)
// Ces noms de champs sont calculés automatiquement dans la table Descripteur
// La table Descripteur comporte les noms de champs décrits dans l'onglet Accueil
AddedCustom = Table.AddColumn(TB_DESC, "NestedLists", (_)=> {_[OLD_NAME],_[NOM_COLONNE]})[NestedLists],
// A travers la liste construite on procède au remplacement des noms par défaut par ceux définis dans l'onglet Accueil
Promote = Table.RenameColumns(Source,AddedCustom),
Suppr_Lig_Ctrl_Tete = if CTRL_TETE then Table.Skip(Promote,1) else Promote,
Suppr_Lig_Ctrl_Queue = if CTRL_QUEUE then Table.RemoveLastN(Suppr_Lig_Ctrl_Tete,1) else Suppr_Lig_Ctrl_Tete
in
Suppr_Lig_Ctrl_Queue
L'astuce pour le renommage est ci-dessous :
AddedCustom = Table.AddColumn(TB_DESC, "NestedLists", (_)=> {_[OLD_NAME],_[NOM_COLONNE]})[NestedLists],
puis on l'applique
Promote = Table.RenameColumns(Source,AddedCustom),
Enfin tout est piloté par la table de paramètres
En effet certains progiciels mettent à disposition des fichiers avec des champs de longueur fixe sans séparateur et sans titre de colonne. Ceci est aussi le cas pour certains fichiers issus de Mainframe (site centraux).
Ils peuvent se présenter comme ceci - exemple :
Bien entendu Excel fourni des outils pour effectuer un découpage mais cela reste artisanal. Il y a un bien entendu la solution de lire le fichier texte ligne à ligne en VBA puis effectuer le découpage de l'enregistrement et l'insérer dans les cellules. Ca c'était une des solutions avant PowerQuery.
PowerQuery va donc nous sauver. Faut-il encore le maîtriser ou en avoir quelques connaissances
Cet outil vous simplifie la tâche et il réalise le code M de PowerQuery automatiquement.
Il se présente comme suit :
Cet écran représente la description du fichier donné en exemple plus haut.
Fonctionnement de l'outil
--> Le nom du fichier en sortie est calculé automatiquement
Après avoir sélectionner à traiter il est obligatoire de décrire sa structure :
- Nom des champs
- Longueur
comme suit
La colonne [POS] est calculée automatiquement en fonction de la longueur du champ saisie via cette formule =SI($B15="LONGUEUR";0;B15+C15). Le noms des champs doivent fournis dans l'ordre selon l'enregistrement se trouvant dans le fichier.
Egalement il peut y avoir des enregistrements de contrôles (en-tête, en-queue) [produits par les mainframe en général] et nous n'avons pas besoin. Si tel est le cas cochez ces options
Ces enregistrements seront supprimés par requête PowerQuery.
Dès la description du fichier effectuée il est nécessaire de lancer les traitement PowerQuery afin de récupérer le fichier dans l'onglet
Les traitements PowerQuery sont lancés par
et voici le résultat
Ensuite deux modes d'utilisation :
- soit on conserve l'outil en l'état et vous nommez le fichier sous un autre nom puis vous traitez vos données préparées dans l'onglet RQ_IMPORT_CSV_FB
- soit vous exporter le contenu de cet onglet dans le fichier en sortie qui a été calculé au moment de la sélection
Dans le cas de l'option 2 il faudra activer
Si le fichier est déjà présent
Résultat :
Résultat du fichier produit
PowerQuery : comment ?
TB_DESCRIPEUR
Au moment de l'importation PowerQuery attribue des noms de champs par défaut (Column1...n)
Cette table les calcule automatiquement via la colonne Index afin de procéder au renommage dans la requête RQ_IMPORT_CSV_FB
let
// Table où on retrouve la description de l'enregistrement avec les noms de champs et les longueurs de chacun
TB_DESC = TB_DESCRIPTEUR,
// On récupère la position de chaque champs dans le tableau descripteur d'enregistrement
L_POSITIONS = TB_DESC[POS],
// On récupère le nombre de champs que comporte l'enregistrement
NB_COL=Table.RowCount(TB_DESC),
// On récupère le nom du fichier à importer
FILENAME = getParameters("TB_PARAMS","PARAM_FICHIER_INPUT"),
// Ligne de contrôle
CTRL_TETE = getParameters("TB_PARAMS","PARAM_LIGNE_CONTROLE_TETE"),
CTRL_QUEUE = getParameters("TB_PARAMS","PARAM_LIGNE_CONTROLE_QUEUE"),
Source = Csv.Document(File.Contents(FILENAME),NB_COL,L_POSITIONS,ExtraValues.Ignore,1252),
// Via la table Descripteur on construit la liste {[ancien nom de champ], [nouveau nom de champ]}
// Par défaut les noms de champs sont nommés Column1 à Column(n)
// Ces noms de champs sont calculés automatiquement dans la table Descripteur
// La table Descripteur comporte les noms de champs décrits dans l'onglet Accueil
AddedCustom = Table.AddColumn(TB_DESC, "NestedLists", (_)=> {_[OLD_NAME],_[NOM_COLONNE]})[NestedLists],
// A travers la liste construite on procède au remplacement des noms par défaut par ceux définis dans l'onglet Accueil
Promote = Table.RenameColumns(Source,AddedCustom),
Suppr_Lig_Ctrl_Tete = if CTRL_TETE then Table.Skip(Promote,1) else Promote,
Suppr_Lig_Ctrl_Queue = if CTRL_QUEUE then Table.RemoveLastN(Suppr_Lig_Ctrl_Tete,1) else Suppr_Lig_Ctrl_Tete
in
Suppr_Lig_Ctrl_Queue
L'astuce pour le renommage est ci-dessous :
AddedCustom = Table.AddColumn(TB_DESC, "NestedLists", (_)=> {_[OLD_NAME],_[NOM_COLONNE]})[NestedLists],
puis on l'applique
Promote = Table.RenameColumns(Source,AddedCustom),
Enfin tout est piloté par la table de paramètres
- Auteur
- OGURUMA
- Version
- 1.0