Spaltensuche unter Verwendung einer Liste von TeilstringsIch versuche, Zeilen zu erhalten, in denen der Wert eine Übereinstimmung aus einer definierten Liste von Teilzeichenfolgen hat. Beispiel unten.
Die Teilzeichenfolge, die mich interessiert, ist entweder "aaa" oder "aa bb". Ich habe mit der JSL unten begonnen. Idealerweise ist das Ergebnis [1,2,4,5,7,8,11]. Das folgende Skript konnte alles außer dem letzten (11) abrufen. Trotzdem gibt es vielleicht elegantere Lösungen als die, die ich auch habe. Schätzen Sie die Hilfe!

names default to here(1);
keys_list = {"aaa", "aa bb"};
dt = current data table();
Row_list = dt <<GET rows="" where=""></GET>SkripterstellungBetreff: Spaltensuche mit Liste von TeilstringsIch würde hier höchstwahrscheinlich reguläre Regex mit so etwas verwenden. Wenn es zu langsam wird, dann würde ich vielleicht anfangen, über etwas Komplizierteres nachzudenken
Names Default To Here(1);
keys_list = {"aaa", "aa bb"};
dt = Current Data Table();
regex_pattern = "(" || Concat Items(keys_list, "|") || ")";
row_list = [];
For Each Row(dt,
If(!IsMissing(Regex(lowercase(:TEST), regex_pattern)),
Insert Into(row_list, Row())
);
);
show(row_list); //row_list = [1, 2, 4, 5, 7, 8, 11];Betreff: Spaltensuche mit Liste von TeilstringsHier ist mein Ansatz, um dieses Problem zu lösen
names default to here(1);
keys_list = {"aaa", "aa bb"};
dt = current data table();
row_list=[];
For( i = 1, i <= N Rows( dt ), i++,
For( k = 1, k <= N Items( keys_list ), k++,
If( Contains( :test[i], keys_list[k] ),
row_list = row_list || Matrix( i );
Break();
)
)
);
show(sort ascending(Row_list));Betreff: Spaltensuche mit Liste von Teilstrings@jthi , @txnelson , @vince_faller Danke für die Lösungen! Ich habe tatsächlich vergessen, ein weiteres Szenario zu erwähnen. Das zweite Element in der keys_list ist "aa bb", das sind zwei Wörter, die durch ein Leerzeichen getrennt sind. In dem Datensatz, an dem ich arbeite, könnte es Fälle geben, in denen das Trennzeichen einige andere Sonderzeichen sind. Wenn es beispielsweise eine 12. Zeile mit dem Wert "aa-bb" gibt, möchte ich, dass diese Zeile ebenfalls aufgerufen wird, was zu dem Endergebnis [1,2,4,5,7,8,11 ,12].
Wie sollte ich die Skripte aktualisieren, um dies ebenfalls zu berücksichtigen? Ich vermute, es sollte einen Schritt geben, der alle Trennzeichenmuster in keys_list durch einen Regex-Code für Sonderzeichen ersetzt?
Betreff: Spaltensuche mit Liste von TeilstringsIch denke, ich würde es genau so machen, wie Sie sagen, entweder die keys_list durchlaufen oder sie dort einfach mit "Platzhalter"-Zeichen eingeben (im Falle von regex . sollte funktionieren). Bearbeiten: mit . möglicherweise matchj zu viele verschiedene Zeichen, daher ist es höchstwahrscheinlich besser, eine Zeichenfolge zu erstellen, die alle zulässigen Zeichenfolgen enthält . Eine weitere Quelle für Regex Regex101
Names Default To Here(1);
keys_list = {"aaa", "aa bb"};
new_keys_list = Transform Each({new_key}, keys_list, Substitute(new_key, " ", "."));
dt = Current Data Table();
regex_pattern = "(" || Concat Items(new_keys_list, "|") || ")";
row_list = [];
For Each Row(dt,
If(!IsMissing(Regex(lowercase(:TEST), regex_pattern)),
Insert Into(row_list, Row())
);
);
show(row_list); //row_list = [1, 2, 4, 5, 7, 8, 11];
@vince_faller Ich glaube, ich erinnere mich, etwas darüber gesehen zu haben, aber ich bin mir nicht mehr sicher, in welchem Fall es war und welche Funktion, zumindest mit JMP16, funktioniert IsMissing() mit Strings. Vielleicht war es mit Vergleichen wie "a" == ., da es einen Fehler auslöst:

Betreff: Spaltensuche mit Liste von TeilstringsDanke @jthi !
Regex101 ist eine fantastische Ressource!
Betreff: Spaltensuche mit Liste von TeilstringsWenn Sie es in einer Spaltenformel tun möchten
Names default to here(1);
dt = current data table();
dt << Add Rows({:Test = "aa-bb"});
dt << New Column("Match", Formula(isstring(Regex(:TEST, "(aaa)|(aa.bb)", "\0", IGNORECASE))));
dt << Run Formulas(); // just to make sure the formula runs
match_rows = loc(dt:Match << Get Values());
dt << Delete Columns(:Match);
show(match_rows); // match_rows = [1, 2, 4, 5, 7, 8, 11];
Hier ist ein Regex-Ressource Ich mag es, wenn du es nicht sehr gut kennst.
Ebenfalls @jthi hat `ismissing()` nicht verwendet, um mit Strings zu arbeiten?Ich erinnere mich, dass es immer meine Regexs zerstört hat (deshalb habe ich hier `isstring()` verwendet).Obwohl ich es bis 14.3 versucht habe und es scheint in Ordnung zu sein.
*Bearbeiten* hat den Platzhalter gemacht.
Betreff: Spaltensuche mit Liste von TeilstringsIch habe mein Skript aktualisiert, um dies zu berücksichtigen.Es ist nur ein `.` Platzhalter. Vielleicht möchten Sie Ihren Platzhalter genauer angeben.Es ist normalerweise nicht das Beste, einfach alles zuzulassen.Vor allem, wenn Sie das nicht wirklich wollen.