04-07-2020 11:59 AM
Participation au Prix d'excellence 2018 : une analyse syntaxique particulièrement problématique
Conditions inhabituelles d'analyse d'un fichier texte nécessitant des règles de parsing dynamique à chaque ligne d'un grand fichier de données, avec une logique différente à chaque fois en fonction du type d'enregistrement de la ligne.
Le service Comptabilité de T-Mobile a dû relever un défi très particulier en tentant d'analyser les fichiers texte volumineux reçus quotidiennement par sa société de traitement de cartes bancaires : ces fichiers texte comprennent des données sur les transactions par carte bancaire de TOUTES les boutiques T-Mobile, mais chaque ligne contient des règles de mappage différentes, basées sur le type d'enregistrement de l'article. Ainsi, alors qu'une ligne peut comporter 3 caractères dans la première colonne et 13 dans la suivante, la seconde ligne peut avoir deux colonnes de 8 caractères chacune. Sans aucun des suspects habituels pour les délimiteurs (tabulations, virgules, barres verticales…), j'ai dû trouver une solution pour ajuster de manière dynamique la manière dont chaque ligne du fichier est analysée en fonction de son type d'enregistrement.
Décrivez votre solution
Pour commencer, j'ai examiné la documentation fournie par la société de traitement de cartes bancaires, puis déterminé que, malgré la différence de règles pour chaque ligne du fichier, il existait une logique bien définie en fonction du type d'enregistrement (un code à 3 chiffres proche du début de chaque enregistrement). Par exemple, chaque enregistrement de type 100 suivait le schéma 8-6-3-19-4-10-11-11-11-2-6-3-4-4-79... et chaque enregistrement de type 361 suivait le schéma 1-3-4-9-3-8-9-14-1-8-19-8-98… pour chaque champ, et ainsi de suite.
Exemple de fichier texte original
Ma première étape a consisté à créer le document de mappage de fichier (j'ai utilisé un fichier Excel, au où il faudrait rectifier le mappage par la suite) qui contenait 4 champs : le type d'enregistrement, la description du type d'enregistrement, la longueur du champ et le nom du champ (les noms de champ étaient également différents pour chaque type d'enregistrement). Cela servirait, dans le workflow Alteryx, à la fois à fractionner chaque ligne de données en nombre de champs approprié (avec le bon nombre de caractères) et à nommer ces champs lorsque les données de sortie seraient écrites dans des onglets séparés dans le fichier Excel de sortie.
Exemple de fichier de mappage
REMARQUE : une modification apportée ultérieurement à ce workflow a un peu compliqué les choses lorsque l'on m'a demandé de limiter les résultats à des champs spécifiques (différents pour chaque type d'enregistrement) avec un récapitulatif d'informations sur les fichiers. Mais comme j'avais déjà les champs et les en-têtes mappés pour chaque enregistrement, il était très simple de simplement sélectionner les champs dont nous avions besoin et de générer ce sous-ensemble agrégé.
Pour la deuxième étape, j'ai créé le workflow permettant de récupérer les informations de mappage et de les appliquer à chaque enregistrement en fonction de son type. J'ai utilisé l'outil Formule à plusieurs lignes pour créer des numéros de colonne, puis j'ai fait pivoter ces informations de façon à ce que les numéros de colonne deviennent des en-têtes avec le nombre de caractères par champ indiqué dans chaque ligne, par type d'enregistrement.
Association des informations de mappage aux données de transaction
Avec les données ajoutées indiquant le nombre de caractères par champ, j'ai transposé les informations puis les ai synthétisées à l'aide de la fonction Concaténer, configurée comme suit :
Réglage de la synthétisation pour la concaténation
J'ai alors obtenu ce schéma, potentiellement utilisable dans les formules RegEx :
(.{8})(.{5})(.{8})(.{6})(.{8})(.{5})(.{20})(.{30})(.{6})(.{4})(.{4})(.{6})(.{7})(.{7})(.{4})(.{5})(.{10})(.{42})
Cette formule ramènerait 8 caractères pour le premier champ, 5 pour le deuxième et ainsi de suite, de sorte que chaque champ puisse être parsé en fonction du nombre adéquat de caractères sur la base du type d'enregistrement.
J'ai ensuite créé un schéma de remplacement reposant sur le nombre de champs utilisés par les données dans le fichier. Par exemple, pour 10 champs utilisés, j'ai trouvé le nombre maximum de champs (10), utilisé l'outil Générer les lignes pour créer les champs de 1 à 10, puis j'ai concaténé cette liste pour créer « $1|$2|$3|$4|$5|$6|$7|$8|$9|$10 ». Cela peut être utilisé dans la formule RegEx à l'étape suivante en tant que sortie, ce qui ajoute effectivement un délimiteur entre chacun des champs d'après la logique de mappage.
Création d'un schéma de remplacement RegEx
En ajoutant ce schéma aux données de transaction, je pouvais désormais créer une formule RegEx de ce type :
Formule RegEx_Replace
Avec ce parsing des données produisant le nombre correct de champs par type d'enregistrement, j'ai pu associer les noms des champs du fichier de mappage original.
Parsing des données et association aux noms des champs
Il a fallu compléter la préparation des données pour combiner certains enregistrements. Par exemple, les types d'enregistrement 100 et 101 devaient être combinés pour créer l'ensemble de champs complet pour cette transaction. Grâce à plusieurs outils de la catégorie Transformation (plus l'une de mes armes secrètes préférées, l'outil Créer des colonnes), j'ai pu réunir ces enregistrements connexes et créer une version finale des données contenant les champs de base pour la sortie : ID d'enregistrement, Type d'enregistrement, Numéro de colonne, Nom du champ et Données.
Combinaison d'enregistrements
La dernière étape consistait à transférer les enregistrements dans un fichier Excel avec un onglet différent pour chaque type d'enregistrement (puisque les noms des champs variaient chaque fois, je ne pouvais pas tout regrouper). En créant une macro batch qui traitait chaque type d'enregistrement à la fois et envoyait les résultats dans son propre onglet dans Excel, j'ai pu appliquer les noms de colonnes dynamiques en fonction du mappage propre à ce type d'enregistrement.
Sortie du workflow
Macro batch permettant d'envoyer les résultats par onglet et par type d'enregistrement avec ajout dynamique des noms de champs applicables
Workflow final : vue d'ensemble
Exemple de résultats finaux parsés
L'un des principaux avantages de ce worflow, c'est qu'il a non seulement permis de résoudre ce qui apparaissait comme un problème d'analyse syntaxique insurmontable pour ce cas d'usage spécifique lié au traitement des cartes bancaires, mais il est de plus reproductible et adaptable. Ainsi, il peut être utilisé dans beaucoup d'autres conditions de parsing inhabituelles avec très peu de modifications. Cette solution peut facilement être adaptée pour d'autres départements qui sont confrontés à des scénarios de traitement de données similaires, ce qui en fait un outil précieux pour T-Mobile !
La quantité de données qu'il aurait fallu traiter manuellement compliquait grandement la tâche, mais la flexibilité de ce workflow Alteryx nous permet de décider si nous traitons les enregistrements chaque jour, chaque semaine ou chaque mois. Le volume n'est plus un problème, car ce workflow le gère en quelques secondes. En fait, le développement d'une solution totalement fonctionnelle a été incroyablement rapide. J'ai pu produire une ébauche en quelques heures et je n'ai apporté que quelques rectifications mineures par la suite. Sans la flexibilité d'Alteryx, nous aurion