Icône de la ressource

CSV_FB_2TS :: Transformer un fichier de longueur fixe en tableau structuré 1.0

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 :

1695203200732.png


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 :
1695203486327.png


Cet écran représente la description du fichier donné en exemple plus haut.

Fonctionnement de l'outil

1695203575850.png
--> Sélection du fichier à traiter

1695203610369.png

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


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

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
1695203908778.png
.
Les traitements PowerQuery sont lancés par
1695203939601.png



1695203955688.png



1695203976480.png


et voici le résultat
1695204011242.png


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
1695204406730.png
choisir
1695204422713.png


1695204437591.png


Si le fichier est déjà présent

1695204473153.png


Résultat :

1695204487503.png


Résultat du fichier produit

1695204866878.png


PowerQuery : comment ?

1695204556848.png


TB_DESCRIPEUR

1695204592401.png


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
1695204913023.png
Auteur
OGURUMA
Version
1.0
  • J'aime
Réactions: HONORE M.A.H.J