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);
Tableau de donnéesAutreScriptRe : 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);
Re : Convertir un tableau en chaîneEncore une fois, étonné de la capacité de Jim à aller au cœur de la question. Deux jolis bouts 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 pourrait ê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 fonction < message renvoie les valeurs uniques. (Bien fait @jshvt17 .)
et ça?
merged_file << select where(nrows(loc(name_key,:Name_final))>0);
le < message fonctionne sur chaque ligne du fichier_fusionné , un à la fois 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 name_key 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() la fonction renvoie 0 ou 1 qui est ensuite comparée >0 et reste 0 ou 1. Les lignes sont donc 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 ? A 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 des recherches 1e7 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 comparaisons chacune (log2(1e6)). Cela peut aussi être plus facile à suivre pour le prochain mainteneur.
(Non testé. Corrections bienvenues !)
Re : Convertir un tableau en chaîneCraig,
Une fois de plus, j'ai appris quelque chose de nouveau sur JMP.J'avais à l'origine écrit le code à l'aide d'une fonction Contains(), puis 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 super infos