Iterieren durch ein assoziatives Array unter Verwendung einer For-Schleife mit einer leeren Bedingung, während die Bedingung nicht funktioniertIch habe mich weitgehend beraten lassen https://community.jmp.com/t5/JSL-Cookbook/Looping-through-an-Associative-Array-s-elements/tac-p/381693#M112 wie man durch assoziative Arrays iteriert. Mein Verständnis ist, dass der Iterator über die Schlüssel iteriert, nicht über die Werte, aber dass Sie leicht auf die Werte zugreifen können, was bedeutet, dass Sie das Array haben.
Mein Code ist unten.
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
);
);
Die interessierende Variable an diesem Punkt meiner Reise ist query_date, mit dem ich fortfahren muss.Das Problem ist, wie geschrieben steht, dass die innere Schleife aus irgendeinem Grund nicht einmal ausgeführt wird. Die while-Bedingung in der Schleife sollte als True ausgewertet werden, bis die Schleife beendet werden soll, also habe ich sie auf gesetzt
Is Empty(temp_array[temp])
weil temp_array [temp] der erste Wert im assoziativen Array ist, wobei temp der erste Schlüssel "Val1" und der Wert {} ist. Ich denke, eine wichtige Frage ist: Wird {} in Is Empty () als wahr oder falsch ausgewertet? Ich kann dies nicht einmal googeln, da {} Sonderzeichen sind, die Google nicht verarbeitet. Sie können also sehen, warum ich verwirrt bin.
Ich habe den Rest meines Skripts bereits codiert und bin ziemlich zuversichtlich, dass es zu diesem Zeitpunkt mit geringfügigen Fehlern funktionieren wird. Wenn ich diese Hürde überwinden kann, würde das sehr helfen. Der Pseudocode ist in meinem Kopf sehr klar und als neuer JMP JSL-Benutzer werden die Dinge klarer, wofür ich dankbar bin. Vielen Dank für Ihre Hilfe!
Mike
DatentabelleSkriptingBetreff: Durchlaufen eines assoziativen Arrays mithilfe einer For-Schleife mit einer leeren Bedingung, während die Bedingung nicht funktioniertDie Bedingung der for-Schleife muss ausgeführt werden, solange der Schlüssel nicht leer ist
For ( temp = temp_array << First, ! Is Empty(temp), temp = temp_array << Next(temp),
Die Methoden << first und << next des assoziativen Arrays geben entweder einen Schlüssel (eine Zeichenfolge oder eine Zahl) oder den speziellen Wert empty () zurück, wenn keine Schlüssel mehr vorhanden sind. Dieser Schlüssel (falls nicht leer) kann als Index für das assoziative Array verwendet werden.
Das ! ist der nicht Operator.
Bearbeiten: Vielleicht möchten Sie so etwas
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 hat 2 Elemente
key = Val2 hat keine Elemente
key = Val3 hat 3 Elemente
Betreff: Durchlaufen eines assoziativen Arrays mithilfe einer For-Schleife mit einer leeren Bedingung, während die Bedingung nicht funktioniertIch verstehe nicht, warum Sie ein assoziatives Array verwenden?Können Sie erweitern, was Sie sich für die Schleife vorstellen, die Sie ausführen möchten?
IsEmpty () ist eine Funktion, die eine 1 zurückgibt, wenn das Skript nicht weiß, um welches Element es sich handelt, und eine 0, wenn das referenzierte Element vor der Ausführung von IsEmpty () im Skript verwendet wurde.
Deshalb:
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
Über
query_date = dt1 << Select Where (:"ID" == ID);
Das Select Where () führt eine Aktion aus, gibt jedoch nichts zurück.Daher hat query_date keinen Wert.Select Where () setzt den Status der ausgewählten Zeile für alle Zeilen in der Datentabelle, die die Auswahlkriterien erfüllen, auf "Ein".Wenn mehr als eine Zeile in der Datentabelle den Wert ID hat, werden mehrere Zeilen ausgewählt.Möglicherweise suchen Sie nach dem Wert des Abfragedatums für die ausgewählte Zeile.Sie können die Zeilennummern der ausgewählten Zeilen abrufen
dt1 << select where( :ID == ID );
theRows = dt1 << get selected rows;
Es wird eine Matrix der Zeilennummern zurückgegeben, kein Skalierer.Um das Abfragedatum zu erhalten, müssen Sie daher auf den Index verweisen.
dt1 << select where( :ID == ID );
theRows = dt1 << get selected rows;
query_date = dt1:query_date[ theRows[1] ];
Eine einfachere Form, für die der Auswahlschritt nicht erforderlich ist, ist die Verwendung von Get Rows Where ().
query_date = dt1:query_date[ dt1 << get rows where( :ID == ID )[1] ];
Ich hoffe ich helfe und nicht verwirrend.Bitte stellen Sie weiterhin Ihre Fragen.
Betreff: Durchlaufen eines assoziativen Arrays mithilfe einer For-Schleife mit einer leeren Bedingung, während die Bedingung nicht funktioniertDanke, Jim. Das war nett von dir für die schnelle Antwort. Ich schätze es. Gib mir ein bisschen Zeit, um das alles noch einmal zu analysieren, es ist das Wochenende.
MikeBetreff: Durchlaufen eines assoziativen Arrays mithilfe einer For-Schleife mit einer leeren Bedingung, während die Bedingung nicht funktioniertDanke für die Antwort, Jim. Eins: Ich verstehe nicht
query_date = dt1:query_date[ theRows[1] ];
da query_date noch nicht instanziiert ist.
Ist das ein Tippfehler (soll eine andere Variable sein)?
Das Protokoll gibt auch hier einen Fehler aus:
Scoped data table access requires a data table column or variable in access or evaluation of 'dt_ld4:query_date' , dt_ld4:query_date/*###*/
Normalerweise würde ich das alleine herausfinden, aber dieses Problem erweist sich als überraschend herausfordernd, daher bin ich mir nicht ganz sicher.
Vielen Dank,
Mike
Betreff: Durchlaufen eines assoziativen Arrays mithilfe einer For-Schleife mit einer leeren Bedingung, während die Bedingung nicht funktioniertHallo Craige. Das scheint zu funktionieren. Vielen Dank.
Michael
Betreff: Durchlaufen eines assoziativen Arrays mithilfe einer For-Schleife mit einer leeren Bedingung, während die Bedingung nicht funktioniertOK ...... Ich habe geraten.Sie haben angegeben, dass Sie das Abfragedatum suchen müssen, und es hat anscheinend mit Ihrem Select Where () zu tun.Ich habe also vermutet, dass in Ihrer Datentabelle eine Spalte mit dem Namen query_date vorhanden ist und Select Where () oder Get Rows Where () die Zeile mit dem gewünschten Abfragedatum zurückgeben würde.Und anscheinend habe ich falsch geraten, wo das Abfragedatum zu finden ist.
Betreff: Durchlaufen eines assoziativen Arrays mithilfe einer For-Schleife mit einer leeren Bedingung, während die Bedingung nicht funktioniertIch renne
dt1 << select where( :ID == ID );
theRows = dt1 << get selected rows;
Write(theRows);
Nur um zu überprüfen, ob die Auswahl der Zeilen funktioniert, und es sieht nicht so aus, als würden wir sogar so weit kommen. Es druckt:
[](0, 1)
Dabei sollte für jede Iteration durch die Schleife eine sehr umfassende Zeile (über 20 Spalten) aus der Datentabelle gedruckt werden. Ich habe keine Ahnung, was los ist.
Um zu versuchen, Ihre implizite Frage zu beantworten, ist theRows nur eine temporäre Variable, um die Zeilen zu finden, die sich aus dem ID-Spaltenwert ergeben, der mit dem in der Schleife angegebenen Wert übereinstimmt (aufgrund mehrerer Kopien der ID können mehrere Zeilen dieser Art vorhanden sein).
Mir ist klar, dass das verwirrend ist ... aber deshalb kämpfe ich auch.
Danke im Voraus,
Mike