Iterando a través de una matriz asociativa usando un ciclo For con una condición de tiempo vacío que no funcionaRecibí consejos en gran parte de Bucle a través de los elementos de una matriz asociativa 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 en 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 necesito para continuar.El problema es que, tal como está escrito, el bucle 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 desee que el ciclo termine, por lo que lo configuré en
Is Empty(temp_array[temp])
porque temp_array[temp] es el primer valor en 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 googlear esto 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, sería de gran ayuda. El pseudocódigo está 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
Acceso a los datosRe: Iterando a través de una matriz asociativa usando un ciclo For con una condición de tiempo vacío que no funcionaAquí hay algunos datos anónimos (adjuntos), en formato CSV, incluidas las columnas relevantes ID, Fecha y algunos otros que estoy interesado en usar.
Déjame saber si esto ayuda o no. Estoy dispuesto a continuar el diálogo para ayudar a llegar a la respuesta a esta pregunta.
Miguel
Re: Iterando a través de una matriz asociativa usando un ciclo For con una condición de tiempo vacío que no funcionaSí, dame un momento. Tendré que anonimizar todos los datos e identificadores muy rápido...
Miguel
Re: Iterando a través de una matriz asociativa usando un ciclo For con una condición de tiempo vacío que no funcionaRecibirá el mensaje de error de alcance si su variable y el nombre de la columna son iguales.Por ejemplo, tiene una columna y una variable llamada ID.También query_date.
Mantenga los nombres de sus columnas (más fácil) y cambie los nombres de sus variables.Por ejemplo, :ID y one_id, :query_date y one_query_date.
Re: Iterando a través de una matriz asociativa usando un ciclo For con una condición de tiempo vacío que no funciona¿Puede proporcionar una tabla de datos de muestra?Re: Iterando a través de una matriz asociativa usando un ciclo For con una condición de tiempo vacío que no funcionaEstoy corriendo
dt1 << select where( :ID == ID );
theRows = dt1 << get selected rows;
Write(theRows);
solo para verificar si la selección de theRows está funcionando y, sin embargo, no parece que estemos llegando tan lejos. Imprime:
[](0, 1)
donde debería estar imprimiendo 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 idea de lo que está pasando.
Para intentar ayudar a responder a su pregunta implícita, theRows es solo una variable temporal para encontrar las filas que resultan del valor de la columna ID que coincide con el valor especificado en el bucle (puede haber varias filas de esta naturaleza debido a varias copias de ID).
Me doy cuenta de que esto es confuso... pero por eso también estoy luchando.
Gracias de antemano,
Miguel
Re: Iterando a través de una matriz asociativa usando un ciclo For con una condición de tiempo vacío que no funcionaBien... estaba suponiendo.Usted indicó que necesitaba encontrar query_date, y parecía que tenía que ver con su Select Where().Así que supuse que en su tabla de datos, hay una columna llamada query_date, y Select Where() u Get Rows Where() devolvería la fila que tiene la fecha de consulta deseada.Y aparentemente me equivoqué en cuanto a dónde se puede encontrar la fecha de consulta.
Re: Iterando a través de una matriz asociativa usando un ciclo For con una condición de tiempo vacío que no funcionaHola Craige. Esto parece funcionar. Muchas gracias.
Miguel
Re: Iterando a través de una matriz asociativa usando un ciclo For con una condición de tiempo vacío que no funcionaGracias por la respuesta, Jim. Una cosa: no entiendo
query_date = dt1:query_date[ theRows[1] ];
como 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, por lo que no estoy del todo seguro.
Gracias un montón,
Miguel
Re: Iterando a través de una matriz asociativa usando un ciclo For con una condición de tiempo vacío que no funcionaGracias, Jim. Eso fue amable de tu parte por la rápida respuesta. Te lo agradezco. Dame un poco de tiempo para analizar todo esto de nuevo, es fin de semana.
MiguelRe: Iterando a través de una matriz asociativa usando un ciclo For con una condición de tiempo vacío que no funcionaNo entiendo por qué está utilizando una matriz asociativa.¿Puedes ampliar lo que imaginas que se supone que debe hacer el ciclo que intentas 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);
Select Where() realiza una acción, pero no devuelve nada.Por lo tanto, query_date no tiene valor.Lo que hace Select Where() es establecer el estado de la fila seleccionada en "Activado" para todas las filas de la tabla de datos que cumplen 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 Obtener filas donde().
query_date = dt1:query_date[ dt1 << get rows where( :ID == ID )[1] ];
Espero estar ayudando y no confundiendo.Por favor, continúe haciendo sus preguntas.
Re: Iterando a través de una matriz asociativa usando un ciclo For con una condición de tiempo vacío que 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 <<
El ! 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" )
)
);key=Val1 tiene 2 elementos
key=Val2 no tiene elementos
key=Val3 tiene 3 elementos