Pas plus tard que hier, j’ai été confronté à un problème que je n’avais jamais eu à résoudre avec FME Workbench (renommé FME Form en 2023). Le client avait un tableur Excel avec des lignes qui fournissaient des informations sur des prises de fibres optiques par commune.
Dans un premier temps, il était nécessaire de supprimer les lignes du fichier qui contenanit le mot clé « Total » peut importe la casse (minuscule/majuscule). Pour cela, rien de bien compliqué, le Transformer Tester est efficace.
Pour supprimer ces lignes j’ai donc appliqué le test logique : l’attribut « Commune » ne commence pas par « Total », notez le NOT dans la partie Logic. Ceci permet d’inverser la sélection.
Le problème majeur du fichier était que pour une commune, il pouvait y avoir plusieurs lignes mais la cellule commune n’était remplie que pour la première ligne. Même problème pour le code INSEE de la commune.
Ex :
Le besoin consistait donc à réparer ce problème automatiquement avec FME. De son côté, le client avait opérer un code VBA et créer une boucle pour corriger le problème.
Sur FME, il est possible de faire une boucle WHILE dans un Transformer personnalisé, voir cet article « comment créer une boucle sur FME ».
De mon côté, en réfléchissant, je me suis dit que nous pourrions utiliser une fonctionnalité peu connue permettant dans FME d’aller chercher les informations de la ou les lignes précédentes et suivantes. Cette fonctionnalité se trouve dans les Transformers AttributeCreator et AttributeManager
La fonctionnalité s’active via l’option « Enable Adjacent Feature Attributes ». Ici j’autorise d’aller chercher des valeurs jusqu’à 100 lignes en amont de ma ligne mais je pourrais aussi l’autoriser en aval.
Dans ce cas je ne savais pas combien de vide il fallait compléter, cela pouvait être 0 ou n lignes.
J’ai donc envisagé de créer un identifiant qui commencerait à 0 à chaque changement de commune. Ici le Transformer Counter a fait quasiment ce que je voulais en groupant sur l’attribut « Commune ».
J’ai dis quasiment car le Transformer Counter affectait 0 à la ligne ou la commune était renseignée mais aussi 0 à la première ligne vide.
J’ai donc ajouté +1 à cette valeur que j’ai nommée indice lorsque la valeur de la commune était vide. Cela a été géré via un AttributeCreator et à sa capacité de créer des valeurs conditionnelles.
Si l’attribut Commune est « Missing », j’ajoute +1 sinon je laisse 0 (première ligne ou commune qui ne possède qu’une ligne dans le fichier).
C’est ainsi que j’avais un indice correcte. Il restait maintenant à utiliser un mécanisme dynamique permettant d’aller chercher la valeur de la ligne n-[indice]. J’ai donc actionner la fonctionnalité permettant de chercher les valeurs en amont/aval de la ligne en traitement, cf un peu plus haut.
Et voilà comment j’ai procédé, de nouveau dans l’AttributeCreator, j’ai créé une valeur conditionnelle pour différencier les lignes qui n’avaient pas besoin d’aller chercher la valeur du code insee en amont (indice = 0) des autres.
Bizarrement FME indiquait une erreur dans la création de l’expression alors que pourtant cela fonctionne parfaitement ! Je vais poser la question à l’editeur Safe Sofwtare.
Résultat final
Encore une fois en quelques minutes, nous avons pu résoudre un problème jusqu’à là jamais traitée par moi mais la connaissance de la fonctionnalité, un peu de réflexion en groupe et l’expertise de SITDI-France ont permis de résoudre ce problème. Le traitement final a chargé les données dans une base PostgreSQL/GIS et ces informations ont permis de créer des vues afin de générer des rapports sur un WEB SIG et sur Excel.
Vous souhaitez me challenger et voir ce dont est capable FME Flow, n’hésitez pas à me contacter !
Au plaisir de valoriser au mieux vos data et géodata.
Loïc Guénin Randelli, expert FME certifié.