Déterminer si une colonne existe<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />J'ai un script JMP qui crée une nouvelle colonne avec une formule. J'essaie de savoir comment détecter si la colonne existe déjà afin que je puisse ignorer sa création et éviter de générer des colonnes supplémentaires. Je suis sûr que c'est là, mais je ne le trouve pas dans la littérature que j'ai.
Merci.
Mike
Re : Déterminer si une colonne existeVoici une version de ma logique qui est insensible à la casse.
dt = open("$sample_data\Big Class.jmp");
col_name_list = dt << get column names(string);
// Convert all column names to uppercase for case-insensitive search
for (i = 1, i <= nitems(col_name_list), i++,
col_name_list[i] = uppercase(col_name_list[i]);
);
new_column = "BMI";
// English BMI Formula BMI = ( Weight in Pounds / ( Height in inches^2 ) ) x 703
if (!contains(col_name_list, uppercase(new_column)),
dt <<NEW column=""></NEW>Re : Déterminer si une colonne existeMerci Mme !
Seul votre exemple a fonctionné pour moi, car l'autre solution est sensible à la casse. J'ai dû utiliser le vôtre, car je ne pouvais pas être sûr que la casse de mes caractères de chaîne soit correcte.Re : Déterminer si une colonne existePMroz,
Permettez-moi de commencer par confirmer que le code que vous avez écrit a également fonctionné pour moi et que l'explication que j'ai écrite n'est pas cohérente avec le comportement de JMP 9 ou 10.
Après avoir lu votre réponse, j'ai également essayé plusieurs combinaisons différentes d'instructions contains et if avec des listes, des chaînes et des nombres dans JMP 9 et 10. Bien que mes tentatives n'aient pas été exhaustives, tous mes résultats sont cohérents avec les vôtres. Au départ, lorsque j'ai lu votre premier message, je me suis souvenu d'un dépannage que j'avais effectué des années auparavant, où j'avais adopté l'utilisation de contains()>0. Je suis incapable de recréer le scénario ; cependant, j'ai trouvé les informations suivantes dans le guide de script JMP. Il détaille l'utilisation de contains avec > 0, ce qui peut être approprié pour leur exemple, mais n'indique pas explicitement qu'il est ou n'est pas requis.
Page 136 du guide de création de scripts JMP version 10 :
"Pour évaluer si un élément est dans une liste, utilisez Loc() et Contient() avec >0 . Une valeur retournée de zéro
signifie que l'élément n'est pas dans la liste. Une valeur renvoyée de 1 signifie que l'élément est dans la liste au moins une fois."
...
"Découvrez si le nombre 5 existe dans le numListe :
NRow(Loc(numList, 5)) >0 ;
0
Contient(numListe, 5) >0 ;
0"
J'espère que cela t'aides.
Re : Déterminer si une colonne existeBonjour wiebepo,
J'ai essayé différentes combinaisons et la négation d'un entier positif, quelle que soit sa taille, donne un 0. Mon code fonctionnera donc (dans JMP 9 et 10).Cela dit, j'apprécie les avertissements : cette approche peut ne pas fonctionner dans toutes les langues.Cela mérite certainement d'autres tests.
b = 2000000000000;
!b;
Le journal affiche :
0
Salutations,
PMroz
Re : Déterminer si une colonne existeAussi pratique à savoir. Je suis toujours heureux d'avoir un autre outil à ajouter à la boîte à outils.
Merci.
Re : Déterminer si une colonne existeC'est très pratique à savoir. Je vais devoir faire attention à ça.
Merci
Re : Déterminer si une colonne existeIl n'y a pas de fonction unique à ma connaissance. Mais Est manquant() en combinaison avec Est inscriptible() peut faire l'affaire.
La colonne doit également être entourée d'une instruction Try() pour éviter que le script ne s'arrête si la colonne n'existe pas.
dt = Open( "$sample_data\Big Class.jmp" );
new_column = "BMI";
If( Is Missing( Is Scriptable( Try( Column( new_column ) ) ) ),
dt << New Column( new_column, numeric, continuous, formula( 703 * :weight / :height / :height ) )
);
Re : Déterminer si une colonne existeJe ne suis pas certain que cela soit vrai dans toutes les versions récentes de JMP. Je fais ce commentaire uniquement pour souligner une opportunité d'améliorer la robustesse du code.
'Contains' renvoie la position de l'élément, ce qui est bien à utiliser dans une instruction 'if', car zéro sera interprété comme faux et une valeur positive sera interprétée comme vraie. Lorsqu'il précède un contient avec un non '!', la condition fonctionne lorsque l'élément n'est pas présent ou lorsqu'il est présent en tant que premier élément ; cependant, lorsque l'élément n'est pas le premier (une valeur supérieure à 1), le pas '!' peut échouer à convertir la condition en fausse. Ceci peut être évité en utilisant une comparaison '>0' avec le 'contient'. Voir ci-dessous pour la syntaxe.
dt = Open( "$sample_data\Big Class.jmp" );
col_name_list = dt << get column names( string );
new_column = "BMI";
// English BMI Formula
// BMI = ( Weight in Pounds / ( Height in inches x Height in inches ) ) x 703
If( !(Contains( col_name_list, new_column ) > 0),
dt << New Column( "BMI", numeric, continuous, formula( 703 * :weight / :height / :height ) )
);
Re : Déterminer si une colonne existeMerci, ça marche très bien pour moi. Je m'attendais à trouver une fonction pour vérifier l'existence, mais cela fonctionne.
Re : Déterminer si une colonne existe
dt = open("$sample_data\Big Class.jmp");
col_name_list = dt << get column names(string);
new_column = "BMI";
// English BMI Formula
// BMI = ( Weight in Pounds / ( Height in inches x Height in inches ) ) x 703
if (!contains(col_name_list, new_column),
dt <<NEW column=""></NEW>