Búsqueda de columnas usando la lista de cadenas parcialesEstoy intentando obtener filas donde el valor coincide de una lista definida de cadenas parciales. Ejemplo a continuación.
La cadena parcial que me interesa es "aaa" o "aa bb". Comencé 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>Automatización y secuencias de comandosRe: Búsqueda de columnas usando lista de cadenas parcialesActualicé mi script para acomodar esto.Es sólo un comodín `.`. Es posible que desee ser más específico acerca de su comodín.Por lo general, no es lo mejor permitir nada.Especialmente si eso no es lo que realmente quieres.
Re: Búsqueda de columnas usando lista de cadenas parcialesGracias @jthi !
expresión regular101 ¡Es un recurso fantástico!
Re: Búsqueda de columnas usando 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 el caso de expresiones regulares, debería funcionar). Editar: usando . Puede que coincidan con demasiados caracteres diferentes, por lo que es mejor crear 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 sobre eso, 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 lista de cadenas parciales@jthi , @txnelson , @vince_faller ¡Gracias por las soluciones! De hecho, olvidé mencionar un escenario más. El segundo elemento en la lista de claves 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 sean otros caracteres especiales. Por ejemplo, si hay una fila número 12 con un valor de "aa-bb", me gustaría que también se llame 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 key_list con un código de expresión regular para caracteres especiales.
Re: Búsqueda de columnas usando lista de cadenas parciales@jthi , @txnelson , @vince_faller ¡Gracias por las soluciones!
De hecho, olvidé mencionar un escenario más. El segundo elemento en la lista de claves 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 sean otros caracteres especiales. Por ejemplo, si hay una fila número 12 con un valor de "aa-bb", me gustaría que también se llame 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 key_list con un código de expresión regular para caracteres especiales.
Re: Búsqueda de columnas usando lista de cadenas parciales@jthi , @vince_faller , @txnelson . ¡Gracias! ¡Estas son excelentes soluciones!
De hecho, olvidé incluir un escenario más que podría ver en los datos en los que estoy trabajando. El segundo elemento en la lista de claves es "aa bb", que son dos palabras separadas por un delimitador de espacio. En mi conjunto de datos, puede haber casos en los que las palabras estén separadas por otros caracteres especiales, pero aun así me gustaría incluirlas. Por ejemplo, si hay una fila número 12 con un valor de "aa-bb", me gustaría que también se mencionara, por lo tanto, el resultado final será [1,2,4,5,7,8,11,12 ]
¿Cómo harías para actualizar los scripts para adaptarlos a esto? Supongo que hay un paso en el que todos los delimitadores en key_list se reemplazan con un código especial para caracteres especiales que pueden reconocerse en un patrón mediante expresiones regulares.
¡Gracias por la ayuda!
Re: Búsqueda de columnas usando 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 conoces muy bien.
También @jthi ¿No solía `ismissing()` funcionar con cadenas?Recuerdo que siempre mataba mis expresiones regulares (de ahí que usé `isstring()` aquí).Aunque lo probé desde 14.3 y parece estar bien.
*Editar* creó el comodín.
Re: Búsqueda de columnas usando 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 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];