条件が機能していないときに空のForループを使用して連想配列を反復処理する主にからアドバイスをもらいましたhttps://community.jmp.com/t5/JSL-Cookbook/Looping-through-an-Associative-Array-s-elements/tac-p/381693#M112連想配列を反復処理する方法について。 私の理解では、イテレータは値ではなくキーを反復処理しますが、値に簡単にアクセスできるため、配列があります。
私のコードは以下の通りです。
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
);
);
私の旅のこの時点で関心のある変数はquery_dateであり、これを続行する必要があります。問題は、書かれているように、何らかの理由で内部ループが一度も実行されないことです。 ループを終了するまで、ループ内のwhile条件はTrueと評価されるはずなので、次のように設定します。
Is Empty(temp_array[temp])
temp_array [temp]は連想配列の最初の値であり、tempは最初のキー "Val1"であり、値は{}であるためです。 重要な質問は次のとおりです。IsEmpty()で{}はTrueまたはFalseに評価されますか? {}はグーグルが処理しない特殊文字であるため、これをグーグルで検索することすらできません。 だからあなたは私が混乱している理由を見ることができます。
スクリプトの残りの部分はすでにコード化されており、この時点でマイナーエラーで機能するとかなり確信しているので、このハードルを乗り越えることができれば大いに役立ちます。 擬似コードは私の頭の中で非常に明確であり、新しいJMP JSLユーザーとして、物事はより明確になりつつあり、私は感謝しています。 よろしくお願いします!
マイク
データ表スクリプティングRe:条件が機能していないときに空のForループを使用して連想配列を反復処理するキーが空でないときにforループの条件を実行する必要があります
For ( temp = temp_array << First, ! Is Empty(temp), temp = temp_array << Next(temp),
連想配列の<< firstメソッドと<< nextメソッドは、キー(文字列または数値)を返すか、キーがなくなると特別なempty()値を返します。 そのキー(空でない場合)は、連想配列へのインデックスとして使用できます。
!!それはないオペレーター。
編集:あなたはこのようなものが欲しいかもしれません
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には2つの要素があります
key = Val2には要素がありません
key = Val3には3つの要素があります
Re:条件が機能していないときに空のForループを使用して連想配列を反復処理する連想配列を使用している理由がわかりませんか?実行しようとしているループが実行することになっていることを拡張できますか?
IsEmpty()は、スクリプトが参照されるアイテムが何であるかを知らない場合は1を返し、IsEmpty()の実行前に参照されるアイテムがスクリプトで使用されている場合は0を返す関数です。
したがって:
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
について
query_date = dt1 << Select Where (:"ID" == ID);
Select Where()はアクションを実行しますが、何も返しません。したがって、query_dateには値がありません。Select Where()が行うことは、選択条件を満たすデータテーブル内のすべての行に対してSelected RowStateを「On」に設定することです。データテーブルの複数の行にIDの値がある場合、複数の行が選択されます。おそらくあなたが探しているのは、選択した行のクエリ日付の値です。選択した行の行番号を取得できます
dt1 << select where( :ID == ID );
theRows = dt1 << get selected rows;
スケーラーではなく、行番号の行列を返します。したがって、query_dateを取得するには、添え字を参照する必要があります。
dt1 << select where( :ID == ID );
theRows = dt1 << get selected rows;
query_date = dt1:query_date[ theRows[1] ];
選択手順を必要としない、より単純な形式は、Get Rows Where()を使用することです。
query_date = dt1:query_date[ dt1 << get rows where( :ID == ID )[1] ];
私は私が助けて、混乱しないことを願っています。引き続き質問してください。
Re:条件が機能していないときに空のForループを使用して連想配列を反復処理するありがとう、ジム。 迅速な対応ができてよかったです。 それは有り難いです。 このすべてをもう一度解析するために少し時間をください。週末です。
マイクRe:条件が機能していないときに空のForループを使用して連想配列を反復処理する返信ありがとう、ジム。 一つのこと:私は理解していません
query_date = dt1:query_date[ theRows[1] ];
query_dateはまだインスタンス化されていないため。
これはタイプミスですか(別の変数であると想定されます)?
ログもここでエラーをスローします:
Scoped data table access requires a data table column or variable in access or evaluation of 'dt_ld4:query_date' , dt_ld4:query_date/*###*/
私は通常これを自分で理解しますが、この問題は驚くほど困難であることが証明されているので、完全にはわかりません。
本当にありがとう、
マイク
Re:条件が機能していないときに空のForループを使用して連想配列を反復処理するこんにちはクレイジ。 これはうまくいくようです。 どうもありがとうございました。
マイケル
Re:条件が機能していないときに空のForループを使用して連想配列を反復処理するOK……推測していた。query_dateを見つける必要があることを示しましたが、Select Where()に関係しているようです。したがって、データテーブルにはquery_dateという列があり、Select Where()またはGet Rows Where()は、目的のクエリ日付を持つ行を返すと推測しました。そして、どうやら私はクエリの日付がどこにあるかについて間違って推測しました。
Re:条件が機能していないときに空のForループを使用して連想配列を反復処理する私は走っています
dt1 << select where( :ID == ID );
theRows = dt1 << get selected rows;
Write(theRows);
行の選択が機能しているかどうかを確認するだけですが、それほど遠くまで進んでいるようには見えません。 それは印刷します:
[](0, 1)
ここで、ループの各反復について、データテーブルから非常に包括的な行(20列以上)を出力する必要があります。 何が起こっているのかわかりません。
暗黙の質問に答えるために、theRowsは、ループで指定された値と一致するID列の値から生じる行を見つけるための一時変数です(IDのコピーが複数あるため、この性質の行が複数ある場合があります)。
これは紛らわしいと思います...しかし、それが私も苦労している理由の一種です。
前もって感謝します、
マイク