Extraiga todos los elementos deseados de una cadena para permitir el análisis de respuestas múltiples¡Hola! Tengo datos de SharePoint que usamos (entre otras cosas) para rastrear qué herramientas/técnicas se utilizaron para resolver un problema. Esto incluye JMP, por cierto.Los datos (en una columna) siguen este tipo de formato delimitado por ;:
;#;;#;;#...
3.4 Herramientas de simulación y optimización sin conexión;#15;#3.9 Simulación;#30;#4.6 Balance de materiales;#22
Cada fila de la tabla (problema resuelto) puede tener uno o más . A veces la comienza con #, a veces no. Pero siempre va precedido de #.
Me gustaría analizar la cadena para los y el formato para el análisis de respuesta múltiple: 15, 30, 22 (ejemplo anterior).
- Hay ~100 , por lo que crear ~100 columnas dispersas parece un desperdicio.¿Es el enfoque utilizado en el archivo de datos de muestra Failures3Delimited.jmp la forma más eficaz de abordar este problema?
- Comencé a aprender REGEX y pude encontrar una aparición de , pero no todas. ¿Necesito un bucle? ¿Alguna otra forma de hacer esto?
Gracias. Utilizando JMP17.1 Pro.
Automatización y secuencias de comandosCombinación y limpieza de datosRe: Extraer todos los elementos deseados de una cadena para permitir el análisis de respuestas múltiplesAquí hay una posible solución que se me ocurrió:

Aquí está la fórmula que utilicé.
i = 1;
string = "";
While( Word( i, :Input, "#;" ) != "",
theWord = Word( i, :Input, "#;" );
If( Is Missing( Num( theWord ) ) == 0,
string = string || "," || theWord
);
i++;
);
Try( Substr( string, 2 ) );
Re: Extraer todos los elementos deseados de una cadena para permitir el análisis de respuestas múltiplesMuy elegante: en lugar de una complicada división de primer segundo (dos veces el mismo delimitador) o alguna parte en la que sea el TEXTO, simplemente:
encuentra los números 
Esperemos que no haya ningún ID #30-2...
o una descripción: 42
New Column( "IDs",
Character,
"Multiple Response",
Formula(
Concat Items(
Transform Each( {theWord}, Words( :Input, ";#" ),
Char( Num( theWord ) )
),
""
)
),
Set Property( "Multiple Response", Multiple Response( Separator( "." ) ) ),
)
Re: Extraer todos los elementos deseados de una cadena para permitir el análisis de respuestas múltiplesNo sugeriré usar Patrón de carácter de JMP ya que es bastante difícil de entender (al menos todas las diferentes funcionalidades) pero logré (tal vez) hacerlo usándolo
Names Default To Here(1);
str = "3.4 Offline Optimization & Simulation Tools;#15;#3.9 Simulation;#30;#4.6 Material Balance;#22";
idlist2 = {};
resval = "";
Pat Match(str, Pat Span("#") + Pat Regex("\d+?") >> next_id + Pat Regex("(;|$)") + Pat Test(
Insert Into(idlist2, next_id); resval = Concat Items(idlist2, ", "))
);
show(idlist2, resval);
Aquí hay un ejemplo usándolo en la fórmula.
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(1),
Compress File When Saved(1),
New Column("Column 1",
Character,
"Nominal",
Set Values(
{
"3.4 Offline Optimization & Simulation Tools;#15;#3.9 Simulation;#30;#4.6 Material Balance;#22"
}
)
),
New Column("Column 2",
Character,
"Multiple Response",
Formula(
idlist2 = {};
resval = "";
Pat Match(
:Column 1,
Pat Span("#") + Pat Immediate(Pat Regex("\d+?"), next_id)
+Pat Regex("(;|$)") + Pat Test(
Insert Into(idlist2, next_id);
resval = Concat Items(idlist2, ", ");
)
);
resval;
),
Set Property("Multiple Response", Multiple Response(Separator(",")))
)
)Re: Extraer todos los elementos deseados de una cadena para permitir el análisis de respuestas múltiples¡Gracias Jim! Estaba pensando que algún tipo de bucle funcionaría, con o sin REGEX. Espero que estés bien!
Re: Extraer todos los elementos deseados de una cadena para permitir el análisis de respuestas múltiplesJarmo: ¡Gracias por tu esfuerzo! Leí las secciones REGEX y Pat Match en el Manual de secuencias de comandos y decidí no probar Pat Match a menos que sea absolutamente necesario...
Re: Extraer todos los elementos deseados de una cadena para permitir el análisis de respuestas múltipleshogi: ¡Gracias por ambos envíos! Había usado Words() antes, pero no pensé en ello porque desde el principio me convencí de que tendría que buscar una solución REGEX. ¡Esta solución es muy elegante! Necesito leer sobre los elementos de Concat()...
Jim/Jarmo/hogi: ¡has demostrado el poder global de la comunidad! Ahora estoy sentado en Kuala Lumpur. Publiqué esto a primera hora de la mañana, cuando probablemente estabas a punto de dormir o ya estabas durmiendo. Recibí una solución tuya al final de la tarde. ¡Gracias de nuevo!
Re: Extraer todos los elementos deseados de una cadena para permitir el análisis de respuestas múltiples@hogi escribió:
...complicada división del primer-segundo...
en realidad, menos complicado de lo que pensaba 
New Column( "IDs",
Character,
"Multiple Response",
Formula(
splitItems = Words( :Input, ";#" );
Concat Items( splitItems[2:: N Items( splitItems ):: 2], "," );
)
)
... y una de las próximas versiones de Jmp lo pondrá aún más fácil:
https://community.jmp.com/t5/JMP-Wish-List/new-slicing-options-for-matrices/idc-p/614326/highlight/true#M4057
Re: Extraer todos los elementos deseados de una cadena para permitir el análisis de respuestas múltiplesEl cambio necesario es el delimitador actual de una que JMP reconoce como respuestas múltiples. La función Sustituto también funcionaría bien en este caso.
Re: Extraer todos los elementos deseados de una cadena para permitir el análisis de respuestas múltiples?