Iterando a través de una matriz asociativa usando un bucle for con una condición vacía while no funcionaRecibí consejos en gran parte de https://community.jmp.com/t5/JSL-Cookbook/Looping-through-an-Associative-Array-s-elements/tac-p/381693#M112 sobre cómo iterar a través de matrices asociativas. Tengo entendido que el iterador itera sobre las claves, no los valores, pero que puede acceder fácilmente a los valores que tiene la matriz.
Mi código está abajo.
Names Default To Here(1);
dt1 = Open("file path" );
dt2 = Open("file path 2");
Summarize(dt1, IDs = by(:ID)); //this finds all the unique IDs in the data file, which we will need
//First, populate the temporary data structure--associative array--from the dt1 data file which we will then copy over to the dt2 data file.
For (i=1, i<=N Items(IDs), i++,
ID = IDs[i];
temp_array = Associative Array ({"Val1","Val2","Val3"},{{},{},{}});
For ( temp = temp_array << First, Is Empty(temp_array[temp]), temp = temp_array << Next(temp),//looping through temp_array's keys is clunky but done this way in JMP
query_date = dt1 << Select Where (:"ID" == ID);
Write(query_date);
//etc not there yet because the above not working
);
);
La variable de interés en este punto de mi viaje es query_date, que debo continuar.El problema es que, como está escrito, el ciclo interno no se ejecuta ni una sola vez por alguna razón. La condición while en el ciclo debe evaluarse como Verdadero hasta que quiera que el ciclo termine, así que lo tengo configurado en
Is Empty(temp_array[temp])
porque temp_array [temp] es el primer valor de la matriz asociativa, donde temp es la primera clave, "Val1", y el valor es {}. Supongo que una pregunta importante es: ¿{} se evalúa como Verdadero o Falso en Is Empty ()? Ni siquiera puedo buscar en Google porque {} son caracteres especiales que Google no procesa. Entonces puedes ver por qué estoy confundido.
Ya tengo el resto de mi script codificado y estoy bastante seguro de que funcionará con errores menores en este punto, así que si puedo superar este obstáculo, eso ayudaría mucho. El pseudocódigo es muy claro en mi mente y, como nuevo usuario de JMP JSL, las cosas se están volviendo más claras, por lo que estoy agradecido. ¡Gracias por toda tu ayuda!
Miguel
Tabla de datosScriptingRe: iterando a través de una matriz asociativa usando un bucle for con una condición vacía mientras no funcionaLa condición del bucle for debe ejecutarse mientras la clave no esté vacía
For ( temp = temp_array << First, ! Is Empty(temp), temp = temp_array << Next(temp),
Los métodos << primero y << siguiente de la matriz asociativa devuelven una clave (una cadena o un número) o el valor especial vacío () cuando no hay más claves. Esa clave (si no está vacía) se puede utilizar como índice de la matriz asociativa.
La ! es el no operador.
editar: es posible que desee algo como esto
temp_array = Associative Array( {"Val1", "Val2", "Val3"}, {{1, 2}, {}, {3, 4, 5}} );
For( temp = temp_array << First, !Is Empty( temp ), temp = temp_array << Next( temp ),
If( N Items( temp_array[temp] ) > 0,
Write( "\!nkey=", temp, " has ", N Items( temp_array[temp] ), " elements" ),
Write( "\!nkey=", temp, " has no elements" )
)
);clave = Val1 tiene 2 elementos
clave = Val2 no tiene elementos
clave = Val3 tiene 3 elementos
Re: iterando a través de una matriz asociativa usando un bucle for con una condición vacía mientras no funcionaNo entiendo por qué está utilizando una matriz asociativa.¿Puede ampliar lo que imagina que debe hacer el bucle que está intentando ejecutar?
IsEmpty () es una función que devuelve un 1 si el script no sabe cuál es el elemento al que se hace referencia, y un 0 cuando el elemento al que se hace referencia se ha utilizado en el script antes de la ejecución de IsEmpty ().
Por lo tanto:
a={};
isEmpty(s);
// returns 0 since a has been referenced prior in the script
isEmpty(b);
// returns 1 since JMP has not seen the variable b before
Sobre
query_date = dt1 << Select Where (:"ID" == ID);
Seleccionar dónde () realiza una acción, pero no devuelve nada.Por lo tanto, query_date no tiene valor.Lo que hace Seleccionar dónde () es establecer el Estado de fila seleccionado en "Activado" para todas las filas de la tabla de datos que cumplen con los criterios de selección.Si más de una fila en la tabla de datos tiene el valor de ID, se seleccionarán varias filas.Quizás lo que está buscando es el valor de la fecha de consulta para la fila seleccionada.Puede obtener los números de fila de las filas seleccionadas
dt1 << select where( :ID == ID );
theRows = dt1 << get selected rows;
Devuelve una matriz de los números de fila, no un escalador.Por lo tanto, para obtener query_date, debe hacer referencia al subíndice.
dt1 << select where( :ID == ID );
theRows = dt1 << get selected rows;
query_date = dt1:query_date[ theRows[1] ];
Una forma más simple, que no requiere el paso de selección, sería usar Get Rows Where ().
query_date = dt1:query_date[ dt1 << get rows where( :ID == ID )[1] ];
Espero estar ayudando y no confundiendo.Continúe haciendo sus preguntas.
Re: iterando a través de una matriz asociativa usando un bucle for con una condición vacía mientras no funcionaGracias, Jim. Fue amable de tu parte por la rápida respuesta. Te lo agradezco. Dame un poco de tiempo para analizar todo esto nuevamente, es el fin de semana.
MiguelRe: iterando a través de una matriz asociativa usando un bucle for con una condición vacía mientras no funcionaGracias por la respuesta, Jim. Una cosa: no entiendo
query_date = dt1:query_date[ theRows[1] ];
ya que query_date aún no está instanciado.
¿Es esto un error tipográfico (se supone que es una variable diferente)?
El registro también arroja un error aquí:
Scoped data table access requires a data table column or variable in access or evaluation of 'dt_ld4:query_date' , dt_ld4:query_date/*###*/
Normalmente resolvería esto por mi cuenta, pero este problema está resultando sorprendentemente desafiante, así que no estoy del todo seguro.
Gracias un montón,
Miguel
Re: iterando a través de una matriz asociativa usando un bucle for con una condición vacía mientras no funcionaHola Craige. Esto parece funcionar. Muchas gracias.
Miguel
Re: iterando a través de una matriz asociativa usando un bucle for con una condición vacía mientras no funcionaOK ... estaba adivinando.Indicó que necesitaba encontrar query_date, y parecía que tenía que ver con su Seleccionar dónde ().Así que supuse que en su tabla de datos, hay una columna llamada query_date, y Select Where () o Get Rows Where (), devolvería la fila que tiene la fecha de consulta deseada.Y aparentemente adiviné mal en cuanto a dónde se puede encontrar la fecha de consulta.
Re: iterando a través de una matriz asociativa usando un bucle for con una condición vacía mientras no funcionaEstoy corriendo
dt1 << select where( :ID == ID );
theRows = dt1 << get selected rows;
Write(theRows);
solo para comprobar si la selección de las filas está funcionando, y no parece que estemos llegando tan lejos. Imprime:
[](0, 1)
donde debería imprimir una fila muy completa (más de 20 columnas) de la tabla de datos para cada iteración a través del ciclo. No tengo ni idea de lo que está pasando.
Para tratar de ayudar a responder su pregunta implícita, theRows es solo una variable temporal para encontrar las filas que resultan del valor de la columna de ID que coinciden con el valor especificado en el ciclo (puede haber múltiples filas de esta naturaleza debido a múltiples copias de ID).
Me doy cuenta de que esto es confuso ... pero esa es la razón por la que yo también estoy luchando.
Gracias por adelantado,
Miguel