Búsqueda de columnas usando la lista de cadenas parcialesEstoy tratando de obtener filas donde el valor coincide con una lista definida de cadenas parciales. Ejemplo a continuación.
La cadena parcial que me interesa es "aaa" o "aa bb". He comenzado con el JSL a continuación. Idealmente, el resultado es [1,2,4,5,7,8,11]. El siguiente script pudo obtener todo excepto el último (11). Sin embargo, quizás también haya soluciones más elegantes que las que tengo. ¡Agradezco la ayuda!

names default to here(1);
keys_list = {"aaa", "aa bb"};
dt = current data table();
Row_list = dt <<GET rows="" where=""></GET>secuencias de comandosRe: Búsqueda de columnas usando una lista de cadenas parcialesLo más probable es que use expresiones regulares aquí con algo como esto. Si se vuelve demasiado lento, tal vez empezaría a pensar en algo más complicado.
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];Re: Búsqueda de columnas usando una lista de cadenas parcialesAquí está mi enfoque para resolver este problema.
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));Re: Búsqueda de columnas usando una lista de cadenas parciales@jthi , @txnelson , @vince_faller Gracias por las soluciones! De hecho, olvidé mencionar un escenario más. El segundo elemento en key_list es "aa bb", que son dos palabras separadas por un delimitador de espacio. En el conjunto de datos en el que estoy trabajando, podría haber casos en los que el delimitador sea algún otro carácter especial. Por ejemplo, si hay una fila 12 con un valor de "aa-bb", me gustaría que también se llamara a esa fila, lo que lleva al resultado final de [1,2,4,5,7,8,11 ,12].
¿Cómo debo actualizar los scripts para tener en cuenta esto también? Supongo que debería haber un paso que reemplace todos los patrones delimitadores en keys_list con un código regex para caracteres especiales.
Re: Búsqueda de columnas usando una lista de cadenas parcialesCreo que lo haría exactamente como usted dice, ya sea recorrer la lista de claves o simplemente ingresarlas allí con el carácter de tarjeta "comodín" (en caso de expresiones regulares, debería funcionar). Edito: usando . podría coincidir con demasiados caracteres diferentes, por lo que es mejor construir una cadena que tenga todas las cadenas permitidas . Una fuente más para expresiones regulares expresión regular101
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 Creo recordar haber visto algo al respecto, pero ya no estoy seguro de en qué caso fue y qué función, al menos con JMP16, IsMissing() funciona con cadenas. Tal vez fue con comparaciones como "a" == ., ya que arrojará un error:

Re: Búsqueda de columnas usando una lista de cadenas parcialesGracias @jthi !
expresión regular101 ¡Es un recurso fantástico!
Re: Búsqueda de columnas usando una lista de cadenas parcialesSi quieres hacerlo en una fórmula de columna
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];
Aquí está un recurso de expresiones regulares Me gusta si no lo sabes muy bien.
también @jthi ¿`ismissing()` no solía trabajar en cadenas?Recuerdo que siempre mataba mis expresiones regulares (por eso usé `isstring()` aquí).Aunque lo probé todo el camino de regreso a 14.3 y parece estar bien.
*Editar* hizo el comodín.
Re: Búsqueda de columnas usando una lista de cadenas parcialesActualicé mi script para acomodar esto.Es solo un comodín `.`. Es posible que desee ser más específico acerca de su comodín.Por lo general, no es lo mejor simplemente permitir cualquier cosa.Especialmente si eso no es lo que realmente quieres.