Das Durchlaufen eines assoziativen Arrays mithilfe einer For-Schleife mit einer leeren While-Bedingung funktioniert nichtRatschläge habe ich vor allem von bekommen Durchlaufen der Elemente eines assoziativen Arrays zum Durchlaufen assoziativer Arrays. Meines Wissens nach iteriert der Iterator über die Schlüssel, nicht über die Werte, aber Sie können leicht auf die Werte zugreifen, wenn Sie über das Array verfügen.
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 an diesem Punkt meiner Reise interessante Variable ist query_date, mit der ich fortfahren muss.Das Problem ist, wie es geschrieben steht, dass die innere Schleife aus irgendeinem Grund nicht einmal ausgeführt wird. Die while-Bedingung in der Schleife sollte so lange „True“ ergeben, bis ich möchte, dass die Schleife beendet wird, 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“ ist und der Wert {} ist. Ich denke, eine wichtige Frage ist: Wird {} in Is Empty() als wahr oder falsch ausgewertet? Ich kann das nicht einmal googeln, weil {} Sonderzeichen sind, die Google nicht verarbeitet. Sie können also verstehen, warum ich verwirrt bin.
Ich habe den Rest meines Skripts bereits codiert und bin zu diesem Zeitpunkt ziemlich zuversichtlich, dass es mit kleineren Fehlern funktionieren wird. Wenn ich also diese Hürde überwinden kann, wäre das sehr hilfreich. Der Pseudocode ist mir sehr klar im Kopf und als neuer JMP JSL-Benutzer werden die Dinge immer klarer, wofür ich dankbar bin. Vielen Dank an alle für Ihre Hilfe!
Mike
DatenzugriffBetreff: Das Durchlaufen eines assoziativen Arrays mithilfe einer For-Schleife mit einer leeren While-Bedingung funktioniert nichtHier sind einige anonymisierte Daten (im Anhang) im CSV-Format, einschließlich der relevanten Spalten ID, Datum und einiger anderer, die ich verwenden möchte.
Lassen Sie mich wissen, ob das hilft oder nicht. Ich bin bereit, den Dialog fortzusetzen, um zur Antwort auf diese Frage zu gelangen.
Mike
Betreff: Das Durchlaufen eines assoziativen Arrays mithilfe einer For-Schleife mit einer leeren While-Bedingung funktioniert nichtJa, gib mir einen Moment. Ich muss ganz schnell alle Daten und Identifikatoren anonymisieren ...
Mike
Betreff: Das Durchlaufen eines assoziativen Arrays mithilfe einer For-Schleife mit einer leeren While-Bedingung funktioniert nichtSie erhalten die Scoping-Fehlermeldung, wenn Ihr Variablen- und Spaltenname identisch ist.Sie haben beispielsweise eine Spalte und eine Variable mit dem Namen „ID“.Auch query_date.
Behalten Sie Ihre Spaltennamen bei (einfacher) und ändern Sie Ihre Variablennamen.ZB :ID und one_id, :query_date und one_query_date.
Betreff: Das Durchlaufen eines assoziativen Arrays mithilfe einer For-Schleife mit einer leeren While-Bedingung funktioniert nichtKönnen Sie eine Beispieldatentabelle bereitstellen?Betreff: Das Durchlaufen eines assoziativen Arrays mithilfe einer For-Schleife mit einer leeren While-Bedingung funktioniert nichtIch renne
dt1 << select where( :ID == ID );
theRows = dt1 << get selected rows;
Write(theRows);
Nur um zu überprüfen, ob die Auswahl der Zeilen funktioniert, aber es sieht nicht so aus, als ob wir überhaupt so weit kommen. Es wird Folgendes gedruckt:
[](0, 1)
Dabei sollte für jede Iteration durch die Schleife eine sehr umfassende Zeile (mehr als 20 Spalten) aus der Datentabelle gedruckt werden. Ich habe keine Ahnung, was los ist.
Um Ihre implizite Frage zu beantworten: theRows ist 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 ID-Kopien kann es mehrere Zeilen dieser Art geben).
Mir ist klar, dass das verwirrend ist ... aber das ist irgendwie der Grund, warum ich auch Probleme habe.
Vielen Dank im Voraus,
Mike
Betreff: Das Durchlaufen eines assoziativen Arrays mithilfe einer For-Schleife mit einer leeren While-Bedingung funktioniert nichtOK...ich habe es vermutet.Sie haben angegeben, dass Sie das query_date finden müssen, und es schien, dass es mit Ihrem Select Where() zu tun hatte.Ich vermute also, dass es in Ihrer Datentabelle eine Spalte namens query_date gibt und Select Where() oder Get Rows Where() die Zeile mit dem gewünschten Abfragedatum zurückgeben würde.Und offenbar habe ich falsch geraten, wo das Abfragedatum zu finden ist.
Betreff: Das Durchlaufen eines assoziativen Arrays mithilfe einer For-Schleife mit einer leeren While-Bedingung funktioniert nichtHallo Craige. Das scheint zu funktionieren. Vielen Dank.
Michael
Betreff: Das Durchlaufen eines assoziativen Arrays mithilfe einer For-Schleife mit einer leeren While-Bedingung funktioniert nichtDanke für die Antwort, Jim. Eines: Ich verstehe es nicht
query_date = dt1:query_date[ theRows[1] ];
da query_date noch nicht instanziiert ist.
Ist das ein Tippfehler (sollte es sich um eine andere Variable handeln)?
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 selbst herausfinden, aber dieses Problem erweist sich als überraschend herausfordernd, sodass ich mir nicht ganz sicher bin.
Vielen Dank,
Mike
Betreff: Das Durchlaufen eines assoziativen Arrays mithilfe einer For-Schleife mit einer leeren While-Bedingung funktioniert nichtDanke, Jim. Das war nett von dir für die schnelle Antwort. Ich schätze es. Geben Sie mir etwas Zeit, das alles noch einmal zu analysieren, es ist Wochenende.
MikeBetreff: Das Durchlaufen eines assoziativen Arrays mithilfe einer For-Schleife mit einer leeren While-Bedingung funktioniert nichtIch verstehe nicht, warum Sie ein assoziatives Array verwenden.Können Sie näher erläutern, was die Schleife, die Sie ausführen möchten, Ihrer Meinung nach bewirken soll?
IsEmpty() ist eine Funktion, die eine 1 zurückgibt, wenn das Skript das referenzierte Element nicht kennt, 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
Betreffend
query_date = dt1 << Select Where (:"ID" == ID);
Select Where() führt eine Aktion aus, gibt jedoch nichts zurück.Daher hat query_date keinen Wert.Was Select Where() bewirkt, besteht darin, den Status der ausgewählten Zeile für alle Zeilen in der Datentabelle, die die Auswahlkriterien erfüllen, auf „Ein“ zu setzen.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 gibt eine Matrix der Zeilennummern zurück, keinen Skalierer.Um das query_date 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, die den Auswahlschritt nicht erfordert, wäre die Verwendung von Get Rows Where().
query_date = dt1:query_date[ dt1 << get rows where( :ID == ID )[1] ];
Ich hoffe, ich helfe und verwirre nicht.Bitte stellen Sie weiterhin Ihre Fragen.
Betreff: Das Durchlaufen eines assoziativen Arrays mithilfe einer For-Schleife mit einer leeren While-Bedingung funktioniert nichtDie 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 <<
Der ! 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