Array in String umwandelnHi an alle,
Ich versuche, einen Wert aus einem Array aus einer anderen Tabelle zu erhalten und ihn als Wert für meine Auswahl zu verwenden. Gibt es eine Möglichkeit, das Array in einen String umzuwandeln?
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
merged_file << select where(:Name_final==name_key);
DatentabelleAndereSkriptingRe: Array in String umwandelnIch denke, das wird dir geben, was du willst
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: Array in String umwandelnWieder erstaunt über Jims Fähigkeit, die Frage auf den Punkt zu bringen. Zwei nette Code-Stücke verdienen hier eine längere Erklärung:
Was bewirkt das?
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
ref_file_1 ist eine Datentabellenreferenz, "NAME" ist der Name einer Spalte als String (wörtlich "NAME", könnte aber in einer Variablen sein) und die and Säule -Funktion gibt eine Spaltenreferenz zurück. Das < message ruft alle Werte aus der Spalte ab, einschließlich Duplikate. Das assoziatives Array -Funktion erstellt einen Satz eindeutiger Werte, und die < Nachricht gibt die eindeutigen Werte zurück. (Schön gemacht @jshvt17 .)
und das?
merged_file << select where(nrows(loc(name_key,:Name_final))>0);
Das < Nachricht wird in jeder Zeile des Zusammengeführte_Datei , eine nach der anderen und wählt Zeilen aus, wenn das Argument ungleich Null ist.
Das loc() -Funktion gibt eine Matrix von Indizes zurück. Es durchsucht die Liste in name_key für Vorkommen von :Name_final. Die resultierende Matrix kann null oder mehr Zeilen haben, obwohl sie in diesem Beispiel 0 oder 1 Zeile hat, weil die Schlüssel eindeutig sind. Das nrows() Funktion gibt 0 oder 1 zurück, die dann mit >0 verglichen wird und 0 oder 1 bleibt. Es werden also Zeilen ausgewählt, wenn :Name_final in der Liste von ref_file_1:NAME steht.
Alternative:
Was wäre, wenn es >1e6-Namen in name_key und >1e7-Zeilen in merge_file gäbe? Wie würde die Leistung aussehen? Die loc-Funktion wird viel suchen. Es vergleicht 1e13-Saiten. Sie werden das Warten satt haben. Die Lösung dafür besteht darin, das assoziative Array wie folgt zu verwenden:
nameSet = associative array(column(ref_file_1, "NAME") << get values);
merged_file << select where(contains(nameSet, :Name_final));
Jetzt gibt es nur noch 1e7-Lookups in nameSet. Sie sind nicht kostenlos, aber viel schneller als das sequentielle Überprüfen von 1e6-Elementen. Ich schätze jeweils etwa 20 Vergleiche (log2(1e6)). Dies kann auch für den nächsten Betreuer leichter zu befolgen sein.
(Ungetestet. Korrekturen erwünscht!)
Re: Array in String umwandelnCraige,
Ich habe wieder etwas Neues über JMP gelernt.Ich hatte den Code ursprünglich mit einer Contains()-Funktion geschrieben, dann aber auf die Loc()-Funktion umgestellt, weil ich dachte, dass es ein Problem wäre, bei dem
Contains( "BARBARA ANN", "BARBARA")
gibt ein True zurück.
Ich hatte (fälschlicherweise stellte sich heraus), dass, wenn die Vergleichskomponente von Enthält eine JMP-Liste von Elementen ist,
Contains( {"BARBARA ANN", "BETTY", "DAVID"}, "BARBARA")
würde auch ein True zurückgeben, jedoch wird ein False zurückgegeben, was bedeutet, dass eine absolute Übereinstimmung vorliegt.
Danke für die tollen Infos