Skip to main content

Délimitez vos données dans ModelBuilder

Souvent, les données tabulaires ne sont pas formatées de façon appropriée. Pour mener à bien votre projet, vous pourriez devoir répartir les attributs dans leurs propres champs respectifs afin de pousser plus loin l’analyse. Que faire si le séparateur de données est un caractère particulier? Comment utiliser la puissance de ModelBuilder pour délimiter des données dans leurs propres champs et automatiser le processus? C’est possible! Voici comment.

ModelBuilder est un outil visuel permettant de créer des flux de travaux de géotraitement. Vous pouvez utiliser ModelBuilder pour automatiser des tâches de géotraitement longues et répétitives. ModelBuilder peut également servir à automatiser la délimitation de données. Grâce à ce billet de blogue, vous apprendrez comment faire. Commençons.

Nous avons collecté les données de terrain d’éléments simples et composés détectés dans notre zone d’étude. Pour une de nos études, nous souhaitons lancer une analyse de ces éléments simples et composés, mais les données sont regroupées dans un seul et même champ, ce qui rend l’analyse difficile. Nous ne disposons pas du temps nécessaire à la saisie manuelle de ces données, et nous devons en recevoir une grande quantité supplémentaire dans le même format. Comment peut-on délimiter ces données pour les affecter à leurs propres champs et automatiser ce processus? Nous allons utiliser ModelBuilder.

Table source de données de terrain contenant des éléments simples ou composés

1. Nous devons tout d’abord déterminer le nombre d’éléments individuels présents dans le champ éléments.

Après avoir ouvert un nouveau modèle, ajoutez-lui l’outil Ajouter un champ.

Outil Ajouter un champ (Add Field) de ModelBuilder

Dans l’outil Ajouter un champ, ajoutez un nouvel attribut intitulé IndexLength (longueur de l’index), dont le type (Field Type) est SHORT. Ce champ contiendra le nombre d’éléments individuels séparés par des virgules trouvés dans le champ éléments.

Créez un nouveau champ grâce à l’outil Ajouter un champ

2. Nous allons ensuite compter le nombre d’éléments contenus dans le champ éléments.

Ajoutez au modèle l’outil Calculer un champ.

Ajout de l’outil Calculer un champ (Calculate Field) dans ModelBuilder

Dans l’outil Calculer un champ (Calculate Field), sélectionnez le nouveau champ IndexLength que vous venez de créer afin de visualiser le résultat du calcul. Dans le bloc de code, nommez la fonction indexCount (compte d’index) et indiquez « fields » (champs) comme nom du paramètre d’entrée. Comme le séparateur de données du champ éléments est la virgule, définissez la fonction .split() de manière à ce qu’elle effectue la scission en fonction de ce caractère. Renvoyez la longueur de la fonction .split(‘,’) afin de compter le nombre d’éléments séparés par des virgules. Nommez l’expression indexCount(!ELEMENTS!), conformément au nom de la fonction définie dans le bloc de code. Enfin, indiquez PYTHON comme type d’expression.

Outil Calculer un champ (Calculate Field), avec un bloc de code permettant de faire le compte pour IndexLength

Quand tout cela est fait, enregistrez le modèle et exécutez-le. Le champ IndexLength se remplira avec le nombre d’éléments séparés par des virgules.

Table mise à jour comprenant le champ IndexLength

3. Nous allons ajouter un itérateur For (Pour) au modèle afin d’éviter toute redondance et d’automatiser le processus.

L’itérateur For permettra de parcourir chaque élément compté dans le champ IndexCount, de créer un nouveau champ pour cet élément particulier, puis d’en déplacer la valeur du champ éléments au champ nouvellement créé.

Ajout de l’itérateur For dans ModelBuilder

Définissez les paramètres de l’itérateur For de la façon suivante : valeur initiale (From Value) à 1 et valeur finale (To Value) au plus grand nombre présent dans le champ IndexLength. Dans notre cas, la valeur maximale est 9.

Définissez les paramètres de l’itérateur For de façon à ce que la valeur finale (To Value) soit égale à la plus grande valeur du champ IndexLength

4. Maintenant que nous connaissons le nombre d’attributs et que nous disposons d’un itérateur permettant de les parcourir, nous devons ajouter des champs supplémentaires afin de les stocker.

Ajoutez un nouvel outil Ajouter un champ au modèle.

Ajout d’un deuxième outil Ajouter un champ (Add Field) dans ModelBuilder

Dans ce deuxième outil Ajouter un champ, nous allons utiliser la substitution de variables en ligne dans le paramètre Nom de champ (Field Name). Inscrivez-y Field%Value% : cela permettra d’extraire la variable Value à partir de l’itérateur For, puis de la placer après Field afin de créer un nouveau champ pour chaque itération, de 1 à 9. Paramétrez le Type de champ (Field Type) à TEXT, pour qu’il corresponde au type du champ éléments.

Ajout d’un outil Ajouter un champ (Add Field) avec substitution de variables en ligne

Une fois lancé, le modèle exécutera 9 boucles, ajoutant un nouveau champ à chaque itération.

Table mise à jour comprenant tous les nouveaux champs pour nos éléments délimités

5. Maintenant que nous disposons d’un nouveau champ pour chacun des éléments du champ ELEMENTS, nous devons extraire les valeurs de ces éléments de la colonne ELEMENTS.

Ajoutez un deuxième outil Calculer un champ.

Ajout d’un deuxième outil Calculer un champ (Calculate Field) dans ModelBuilder

Nous allons à nouveau utiliser la substitution de variables en ligne afin d’extraire la valeur de l’élément de la liste fournie par la fonction .split(), puis la placer dans le champ correspondant. Nous enlevons un à la variable en ligne, puisque les valeurs sont stockées dans une liste allant de 0 à 8, et non de 1 à 9 conformément au paramétrage de %Value%.

Outil Calculer un champ (Calculate Field) avec substitution de variables en ligne

6. Enfin, pour garantir que cette approche sera sans erreur et qu’aucune valeur ne sera hors plage, il nous faut sélectionner tous les attributs et retirer la valeur la plus basse de la sélection à chaque boucle de l’itérateur For.

Ajoutez un outil Sélectionner une couche par attribut.

Ajout d’un outil Sélectionner une couche par attribut (Select Layer by Attribute) dans ModelBuilder

Comme pour les quelques outils précédents, nous allons utiliser la substitution de variables en ligne dans l’Expression, et nous allons retirer la valeur courante issue de l’itérateur For de la sélection.

Outil Sélectionner par attribut (Select by Attribute) avec substitution de variables en ligne

7. Nous pouvons maintenant exécuter le modèle dans son intégralité!

Tout d’abord, avant d’exécuter le modèle, assurez-vous d’avoir sélectionné tous les champs dans les options de la table d’attributs. Une fois que tous les attributs sont sélectionnés, validez le modèle, puis sélectionnez Exécuter. Vous recevrez quelques avertissements indiquant qu’IndexLength existe déjà au fur et à mesure des différentes itérations; c’est normal, vous pouvez les ignorer. Si vous l’avez bien configuré, votre tableau devrait ressembler à ceci :

Table dont les attributs délimités se trouvent chacun dans son propre champ

Vous pourriez ne pas voir directement les modifications. Pour corriger cela, actualisez le cache du tableau.

Actualisation du cache (Re-load Cache), accessible dans les options de table de la table d’attributs

Vos attributs sont désormais délimités par des virgules, placés chacun dans un champ et prêts pour l’analyse approfondie. Tout cela, par un simple clic sur un bouton lançant l’exécution de notre modèle construit dans ModelBuilder. Lors de la réception de nouvelles données dans le même format, modifiez légèrement la longueur de l’itérateur For afin qu’elle corresponde au nouveau nombre d’attributs, puis réutilisez ce modèle. Vous gagnerez ainsi un temps précieux. Le modèle peut aussi être modifié très rapidement afin de choisir un séparateur autre que la virgule.

J’espère que ce billet vous a plu et qu’il vous a beaucoup appris!
 

Ce billet a été écrit en anglais par Tom Thompson et peut être consulté ici.