Itération dans un tableau associatif à l'aide d'une boucle For avec une condition While vide ne fonctionnant pasJ'ai reçu des conseils en grande partie de Boucle à travers les éléments d'un tableau associatif sur la façon d'itérer à travers des tableaux associatifs. Ma compréhension est que l'itérateur parcourt les clés, pas les valeurs, mais que vous pouvez facilement accéder aux valeurs donne que 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 qui m'intéresse à ce stade de mon parcours est query_date, que je dois poursuivre.Le problème est que, tel qu'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 veuille 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 : Est-ce que {} est évalué à True ou False dans Is Empty () ? Je ne peux même pas google cela 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 confiant 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 de JMP JSL, les choses deviennent plus claires, ce dont je suis reconnaissant. Merci à tous pour votre aide!
Mike
Accès aux donnéesRe : Itération dans un tableau associatif à l'aide d'une boucle For avec une condition vide While ne fonctionnant pasVoici quelques données anonymisées (ci-jointes), au format CSV, y compris les colonnes pertinentes ID, Date et quelques autres que je souhaite utiliser.
Faites-moi savoir si cela aide ou non. Je suis prêt à poursuivre le dialogue pour aider à trouver la réponse à cette question.
Mike
Re : Itération dans un tableau associatif à l'aide d'une boucle For avec une condition vide While ne fonctionnant pasOui, donnez-moi un instant. Je vais devoir anonymiser toutes les données et identifiants très rapidement...
Mike
Re : Itération dans un tableau associatif à l'aide d'une boucle For avec une condition vide While ne fonctionnant pasVous obtiendrez le message d'erreur de portée si votre nom de variable et de colonne sont identiques.Par exemple, vous avez une colonne et une variable nommée ID.Aussi query_date.
Conservez vos noms de colonnes (plus facile) et changez vos noms de variables.Par exemple :ID et one_id, :query_date et one_query_date.
Re : Itération dans un tableau associatif à l'aide d'une boucle For avec une condition vide While ne fonctionnant paspouvez-vous fournir un exemple de tableau de données ?Re : Itération dans un tableau associatif à l'aide d'une boucle For avec une condition vide While ne fonctionnant 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 allions aussi loin, cependant. 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 dans la boucle. Je n'ai aucune idée de ce qu'il se passe.
Pour essayer d'aider à 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 pour ça que je me bats aussi.
Merci d'avance,
Mike
Re : Itération dans un tableau associatif à l'aide d'une boucle For avec une condition vide While ne fonctionnant pasOK ...... je devinais.Vous avez indiqué que vous deviez trouver le query_date, et il semble que cela ait à voir avec votre Select Where().J'ai donc deviné que dans votre table de données, il y a une colonne appelée query_date, et le 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ération dans un tableau associatif à l'aide d'une boucle For avec une condition vide While ne fonctionnant pasSalut Craige. Cela semble fonctionner. Merci beaucoup.
Michael
Re : Itération dans un tableau associatif à l'aide d'une boucle For avec une condition vide While ne fonctionnant 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 (supposée être une variable différente) ?
Le journal génère é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 tout à fait sûr.
Merci beaucoup,
Mike
Re : Itération dans un tableau associatif à l'aide d'une boucle For avec une condition vide While ne fonctionnant 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 tout cela à nouveau, c'est le week-end.
MikeRe : Itération dans un tableau associatif à l'aide d'une boucle For avec une condition vide While ne fonctionnant 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 quel 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 de IsEmpty().
Donc:
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 pas de valeur.Ce que fait Select Where(), c'est de définir l'état de la ligne sélectionnée sur "On" 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 ce que vous recherchez est 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 le 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 serait d'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 dérange pas.Veuillez continuer à poser vos questions.
Re : Itération dans un tableau associatif à l'aide d'une boucle For avec une condition vide While ne fonctionnant 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 <<
Le ! est le pas opérateur.
edit: vous pourriez vouloir 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 pas d'éléments
key=Val3 a 3 éléments