Itération dans un tableau associatif à l'aide d'une boucle For avec une condition vide lorsque la condition ne fonctionne pasJ'ai reçu des conseils en grande partie de https://community.jmp.com/t5/JSL-Cookbook/Looping-through-an-Associative-Array-s-elements/tac-p/381693#M112 sur la façon d'itérer dans des tableaux associatifs. Je crois comprendre que l'itérateur itère sur les clés, pas sur les valeurs, mais que vous pouvez facilement accéder aux valeurs, car vous avez le tableau.
Mon code est ci-dessous.
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 d'intérêt à ce stade de mon parcours est query_date, dont j'ai besoin pour continuer.Le problème est que, comme il est écrit, la boucle interne ne s'exécute pas une seule fois pour une raison quelconque. La condition while dans la boucle doit être évaluée à True jusqu'à ce que je souhaite que la boucle se termine, donc je l'ai définie sur
Is Empty(temp_array[temp])
car temp_array [temp] est la première valeur du tableau associatif, où temp est la première clé, "Val1", et la valeur est {}. Je suppose qu'une question importante est la suivante: {} évalue-t-il Vrai ou Faux dans Is Empty ()? Je ne peux même pas chercher sur Google, car {} sont des caractères spéciaux que Google ne traite pas. Donc vous pouvez voir pourquoi je suis confus.
J'ai déjà codé le reste de mon script, et je suis assez convaincu qu'il fonctionnera avec des erreurs mineures à ce stade, donc si je peux surmonter cet obstacle, cela aiderait beaucoup. Le pseudocode est très clair dans mon esprit et, en tant que nouvel utilisateur JMP JSL, les choses deviennent plus claires, ce dont je suis reconnaissant. Merci à tous pour votre aide!
Mike
Tableau de donnéesScriptingRe: Itérer dans un tableau associatif à l'aide d'une boucle For avec une condition vide lorsque la condition ne fonctionne pasLa condition de la boucle for doit s'exécuter tant que la clé n'est pas vide
For ( temp = temp_array << First, ! Is Empty(temp), temp = temp_array << Next(temp),
Les méthodes << first et << next du tableau associatif renvoient une clé (une chaîne ou un nombre) ou la valeur spéciale empty () lorsqu'il n'y a plus de clés. Cette clé (si elle n'est pas vide) peut être utilisée comme index du tableau associatif.
Le ! est le ne pas opérateur.
modifier: vous voudrez peut-être quelque chose comme ça
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 a 2 éléments
key = Val2 n'a aucun élément
key = Val3 a 3 éléments
Re: Itérer dans un tableau associatif à l'aide d'une boucle For avec une condition vide lorsque la condition ne fonctionne pasJe ne comprends pas pourquoi vous utilisez un tableau associatif?Pouvez-vous développer ce que vous envisagez que la boucle que vous essayez d'exécuter est censée faire?
IsEmpty () est une fonction qui renvoie un 1 si le script ne sait pas ce qu'est l'élément référencé et un 0 lorsque l'élément référencé a été utilisé dans le script avant l'exécution IsEmpty ().
Par conséquent:
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
Concernant
query_date = dt1 << Select Where (:"ID" == ID);
Le Select Where () effectue une action, mais ne renvoie rien.Par conséquent, query_date n'a aucune valeur.Ce que fait Select Where (), est de définir l'état de la ligne sélectionnée sur "Activé" pour toutes les lignes de la table de données qui répondent aux critères de sélection.Si plusieurs lignes de la table de données ont la valeur ID, plusieurs lignes seront sélectionnées.Peut-être que vous recherchez la valeur de la date de requête pour la ligne sélectionnée.Vous pouvez obtenir les numéros de ligne des lignes sélectionnées
dt1 << select where( :ID == ID );
theRows = dt1 << get selected rows;
Il renvoie une matrice des numéros de ligne, pas un scaler.Par conséquent, pour obtenir la query_date, vous devez référencer l'indice.
dt1 << select where( :ID == ID );
theRows = dt1 << get selected rows;
query_date = dt1:query_date[ theRows[1] ];
Un formulaire plus simple, ne nécessitant pas l'étape de sélection, consisterait à utiliser Get Rows Where ().
query_date = dt1:query_date[ dt1 << get rows where( :ID == ID )[1] ];
J'espère que j'aide et que je ne prête pas à confusion.Veuillez continuer à poser vos questions.
Re: Itérer dans un tableau associatif à l'aide d'une boucle For avec une condition vide lorsque la condition ne fonctionne pasMerci, Jim. C'était gentil de votre part pour la réponse rapide. Je vous en suis reconnaissant. Donnez-moi un peu de temps pour analyser à nouveau tout cela, c'est le week-end.
MikeRe: Itérer dans un tableau associatif à l'aide d'une boucle For avec une condition vide lorsque la condition ne fonctionne pasMerci pour la réponse, Jim. Une chose: je ne comprends pas
query_date = dt1:query_date[ theRows[1] ];
car query_date n'est pas encore instancié.
Est-ce une faute de frappe (censée être une variable différente)?
Le journal renvoie également une erreur ici:
Scoped data table access requires a data table column or variable in access or evaluation of 'dt_ld4:query_date' , dt_ld4:query_date/*###*/
Je trouverais normalement cela par moi-même, mais ce problème s'avère étonnamment difficile, donc je ne suis pas entièrement sûr.
Merci beaucoup,
Mike
Re: Itérer dans un tableau associatif à l'aide d'une boucle For avec une condition vide lorsque la condition ne fonctionne pasSalut Craige. Cela semble fonctionner. Merci beaucoup.
Michael
Re: Itérer dans un tableau associatif à l'aide d'une boucle For avec une condition vide lorsque la condition ne fonctionne pasOK ... je devinais.Vous avez indiqué que vous deviez trouver la date_demande, et il est apparu que cela avait à voir avec votre Select Where ().J'ai donc deviné que dans votre table de données, il y avait une colonne appelée query_date et que Select Where () ou Get Rows Where () renverrait la ligne qui a la date de requête souhaitée.Et apparemment, je me suis trompé quant à l'endroit où la date de la requête peut être trouvée.
Re: Itérer dans un tableau associatif à l'aide d'une boucle For avec une condition vide lorsque la condition ne fonctionne pasje suis entrain de courir
dt1 << select where( :ID == ID );
theRows = dt1 << get selected rows;
Write(theRows);
juste pour vérifier si la sélection de theRows fonctionne, et il ne semble pas que nous soyons même arrivés aussi loin. Il imprime:
[](0, 1)
où il devrait imprimer une ligne très complète (plus de 20 colonnes) à partir de la table de données pour chaque itération à travers la boucle. Je n'ai aucune idée de ce qu'il se passe.
Pour essayer de répondre à votre question implicite, theRows est juste une variable temporaire pour trouver les lignes qui résultent de la valeur de la colonne ID correspondant à la valeur spécifiée dans la boucle (il peut y avoir plusieurs lignes de cette nature en raison de plusieurs copies d'ID).
Je me rends compte que c'est déroutant ... mais c'est en quelque sorte pourquoi je me bats aussi.
Merci d'avance,
Mike