Convertir un tableau en chaîneSalut tout le monde,
J'essaie d'obtenir une valeur d'un tableau d'une autre table et de l'utiliser comme valeur pour ma sélection. Existe-t-il un moyen de convertir le tableau en chaîne?
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
merged_file << select where(:Name_final==name_key);
Modélisation statistique avancéePersonnalisation de masseRe : Convertir un tableau en chaîneCraige,
Une fois de plus, j'ai appris quelque chose de nouveau sur JMP.J'avais initialement écrit le code en utilisant une fonction Contient(), mais ensuite converti en utilisant la fonction Loc(), car ce que je pensais être un problème où
Contains( "BARBARA ANN", "BARBARA")
renvoie un Vrai.
J'avais (à tort, il s'avère) que si le composant de comparaison de Contient est une liste d'éléments JMP,
Contains( {"BARBARA ANN", "BETTY", "DAVID"}, "BARBARA")
renverrait également un True, cependant, il renvoie un False, ce qui signifie qu'il fait une correspondance absolue.
Merci pour les excellentes informations
Re : Convertir un tableau en chaîneEncore une fois, étonné de la capacité de Jim à aller au cœur de la question. Deux jolis morceaux de code méritent ici une explication plus longue :
Qu'est-ce que cela fait?
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
ref_file_1 est une référence de table de données, "NOM" est le nom d'une colonne sous forme de chaîne (littéralement, "NAME", mais peut être dans une variable), et le colonne La fonction renvoie une référence de colonne. Le < message obtient toutes les valeurs de la colonne, y compris les doublons. Le tableau associatif La fonction crée un ensemble de valeurs uniques, et la < message renvoie les valeurs uniques. (Bien fait @29755 .)
et ça?
merged_file << select where(nrows(loc(name_key,:Name_final))>0);
Le < message fonctionne sur chaque ligne du fichier_fusionné , une par une et sélectionne les lignes lorsque l'argument est différent de zéro.
Le loc() La fonction renvoie une matrice d'index. Il recherche la liste dans nom_clé pour les occurrences de :Name_final. La matrice résultante peut avoir zéro ou plusieurs lignes, bien que dans cet exemple, elle ait 0 ou 1 ligne car les clés sont uniques. Le nrows() renvoie 0 ou 1 qui est alors comparé >0 et reste 0 ou 1. Ainsi, les lignes sont sélectionnées si :Name_final est dans la liste de ref_file_1:NAME.
Alternative:
Et s'il y avait > 1e6 noms dans name_key et > 1e7 lignes dans merge_file ? À quoi ressemblerait la performance ? La fonction loc cherchera beaucoup. Il comparera les chaînes 1e13. Vous en aurez marre d'attendre. Le correctif consiste à utiliser le tableau associatif comme ceci :
nameSet = associative array(column(ref_file_1, "NAME") << get values);
merged_file << select where(contains(nameSet, :Name_final));
Maintenant, il n'y a que 1e7 recherches dans nameSet. Ils ne sont pas gratuits, mais ils sont beaucoup plus rapides que la vérification séquentielle des éléments 1e6. Je suppose qu'environ 20 compare chacun (log2(1e6)). Cela peut également être plus facile à suivre pour le prochain responsable.
(Non testé. Corrections bienvenues !)
Re : Convertir un tableau en chaîneJe pense que cela te donnera ce que tu veux
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
merged_file << select where(nrows(loc(name_key,:Name_final))>0);