¿Puedo usar Contiene () dentro de Match ()?Necesito buscar una columna de caracteres para ver si el valor de cada fila contiene cadenas específicas y luego crear un nombre/grupo de indicador en consecuencia en la nueva columna (buscará ~ 14 cadenas específicas).Estoy bastante seguro de que IF() anidado sería bastante lento...He usado Match() en el pasado cuando quiero hacer coincidir cadenas exactas, pero ¿puedo usar comodines?
Intenté * y % pero fue en vano:
Match( :columnOfInterest,
"*StringA*", "String A",
"*StringB*", "String B",
"" )
Luego traté de usar Contiene() dentro de Match() y todavía no tuve suerte:
Match( :columnOfInterest,
Contains(:columnOfInterest, "StringA"), "String A",
Contains(:columnOfInterest, "StringB"), "String B",
"" )
Veo que Contiene devuelve un valor numérico, así que también intenté agregar > comparación e incluso envolver en NUM():
Match( :columnOfInterest,
Contains(:columnOfInterest, "StringA") > 0, "String A",
Contains(:columnOfInterest, "StringB") > 0, "String B",
"" )
y
Match( :columnOfInterest,
Num(Contains(:columnOfInterest, "StringA")) > 0, "String A",
Num(Contains(:columnOfInterest, "StringB")) > 0, "String B",
"" )
Cualquier ayuda es muy apreciada.¡gracias!
Re: ¿puedo usar Contiene() dentro de Match()?Esto resolvió mi problema. Olvidé por completo las matrices asociativas. ¡Muchas gracias!Re: ¿puedo usar Contiene() dentro de Match()?JMPprincipiante

Puede usar una matriz asociativa para almacenar una tabla de búsqueda de las cadenas que desea asignar a diferentes cadenas.
Por ejemplo, arriba :searchTerms y :mappedTerms son las claves y valores de una matriz asociativa de este tipo. En el siguiente código, esta matriz se asigna a la variable "búsqueda". En la fórmula final para la columna asignada a RESULTADOS, verá que cada coincidencia encontrada por Regex sirve como argumento para la matriz de búsqueda.
Por ejemplo, tome la fila 1 en la tabla anterior. El resultado encontrado es "Integra" y el resultado asignado es lookup["Accord"] que es "GroupA"
fmlaExpr = Expr(
If( Row() == 1,
lookUp = Associative Array( :searchTerms, :mappedTerms, Empty() );
vals = :searchTerms << get values;
doThis = Expr(
lookUp[Regex( :ColumnOfInterest, Char( "(" || Concat Items( vals, "|" ) || ")" ) )]
);
doThis;
,
doThis
)
);
Eval( Eval Expr( :RESULTS-mapped << set formula( Expr( Parse( Char( NameExpr(fmlaExpr)) ) ) ) ) );
Se adjunta la tabla de ejemplo completa.
Re: ¿puedo usar Contiene() dentro de Match()?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Tenga en cuenta que "\ 1" en realidad no hace una diferencia ya que solo tenemos 1 patrón. Si hubiera múltiples paréntesis, entonces uno podría tener "\1" o "\n" donde n es <= número de patrones. Ver documento en línea de JMP ==> Expresiones regulares
Re: ¿puedo usar Contiene() dentro de Match()?todo esto tiene sentido, ahora voy a tratar de complicar las cosas...
regex(test,"(ABC|DEF|GHI)","\1")
¿Puedo devolver una cadena diferente a la que coincide?
- si se encuentra "ABC", devuelve "grupo1",
- si se encuentra "DEF", devuelve "grupo2", etc.
¿O eso no es posible con expresiones regulares?
Re: ¿puedo usar Contiene() dentro de Match()?gracias PBZ y Jim, Regex() funciona muy bien y ahora tengo una nueva herramienta para usar durante la creación de secuencias de comandos. ¡muy apreciado!
Re: ¿puedo usar Contiene() dentro de Match()?Regex es la forma de hacerlo, aquí hay un ejemplo muy simple que hará la coincidencia múltiple que desea.Simplemente amplíelo con las cadenas que está buscando.Devolverá la coincidencia que encuentre.
names default to here(1);
test="Answer is ABC";
TheMatch = regex(test,"(ABC|DEF|GHI)","\1");
Re: ¿puedo usar Contiene() dentro de Match()?JMPprincipiante
Evitaría por completo las declaraciones condicionales. Una mejor solución es usar Regex. Por ejemplo, suponga que sus términos de búsqueda fueran modelos de automóviles, "Accord", "Civic", etc. Se puede escribir una declaración Regex que diga: "Coincide con CUALQUIERA de los términos" . En JSL, una fórmula de columna para esto se vería así:
Regex( :columnOfInterest, "(Accord|Civic|Corolla|Dakota|Integra|Maxima|Ranger|S10)" );
Se adjunta un archivo de demostración simple de esto. Regex es extremadamente poderoso en la coincidencia de patrones de cadenas. Hay numerosas opciones para hacer coincidir palabras parciales, raíces de palabras, etc. ¡Espero que te ayude!
-PBZ