空の While 条件で For ループを使用して連想配列を反復処理すると機能しない主にアドバイスをいただきました連想配列の要素をループする連想配列を反復処理する方法について説明します。 私の理解では、イテレーターは値ではなくキーを反復処理しますが、配列があれば値に簡単にアクセスできるということです。
私のコードは以下です。
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」で、値は {} であるためです。 重要な質問は、「Is Empty() で {} は True または False に評価されるのですか?」ということだと思います。 {} は Google が処理しない特殊文字であるため、これを Google で検索することもできません。 それで、私が混乱している理由がわかります。
スクリプトの残りの部分はすでにコード化されており、現時点では軽微なエラーはあるものの動作するだろうとかなり自信を持っているので、このハードルを乗り越えることができれば大いに役立つでしょう。 疑似コードは私の頭の中で非常に明確であり、新しい JMP JSL ユーザーとして物事がより明確になり、感謝しています。 ご協力いただきありがとうございました!
マイク
データアクセスRe: 空の While 条件で For ループを使用して連想配列を反復処理すると機能しないここに、CSV 形式の匿名化されたデータ (添付) がいくつかあります。これには、関連する列 ID、日付、その他、使用したいいくつかの列が含まれています。
これが役に立つかどうか教えてください。 この質問に対する答えを導き出すために、私は対話を続けていきたいと思っています。
マイク
Re: 空の While 条件で For ループを使用して連想配列を反復処理すると機能しないはい、少しお待ちください。 すべてのデータと識別子をすぐに匿名化する必要があります...
マイク
Re: 空の While 条件で For ループを使用して連想配列を反復処理すると機能しない変数と列名が同じ場合、スコープ エラー メッセージが表示されます。たとえば、ID という名前の列と変数があるとします。また、query_date。
列名をそのままにして (簡単です)、変数名を変更します。例:ID と one_id、:query_date と one_query_date。
Re: 空の While 条件で For ループを使用して連想配列を反復処理すると機能しないサンプルデータテーブルを提供していただけますか?Re: 空の While 条件で For ループを使用して連想配列を反復処理すると機能しない私は走っています
dt1 << select where( :ID == ID );
theRows = dt1 << get selected rows;
Write(theRows);
theRows の選択が機能しているかどうかを確認するためだけですが、まだそこまで到達していないようです。 出力されます:
[](0, 1)
ここでは、ループの反復ごとにデータ テーブルから非常に包括的な行 (20 列以上) を出力する必要があります。 何が起こっているのか分かりません。
暗黙の質問に答えるために、theRows は、ループ内で指定された値と一致する ID 列の値から生じる行を検索するための単なる一時変数です (ID のコピーが複数あるため、この性質の行が複数存在する可能性があります)。
これが混乱を招くことはわかっています...しかし、それが私も苦労している理由の一種です。
前もって感謝します、
マイク
Re: 空の While 条件で For ループを使用して連想配列を反復処理すると機能しないOK……推測していました。query_date を見つける必要があることを示しましたが、それは Select Where() に関係しているようです。したがって、データテーブルに query_date という列があり、Select Where() または Get Rows Where() を実行すると、目的のクエリ日付を持つ行が返されると推測しました。そしてどうやら、クエリの日付がどこにあるのかについての推測が間違っていたようです。
Re: 空の While 条件で For ループを使用して連想配列を反復処理すると機能しないこんにちは、クレイジです。 これはうまくいくようです。 どうもありがとうございます。
マイケル
Re: 空の While 条件で 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: 空の While 条件で For ループを使用して連想配列を反復処理すると機能しないありがとう、ジム。 素早い対応でよかったです。 それは有り難いです。 週末なので、もう一度すべてを解析するのに少し時間をください。
マイクRe: 空の While 条件で 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() が行うことは、選択基準を満たすデータ テーブル内のすべての行に対して、選択された行の状態を「オン」に設定することです。データ テーブル内の複数の行に 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: 空の While 条件で For ループを使用して連想配列を反復処理すると機能しないfor ループの条件は、キーが空でないときに実行する必要があります。
For ( temp = temp_array << First, ! Is Empty(temp), temp = temp_array << Next(temp),
連想配列の <<
!それはいいえオペレーター。
編集:このようなものが必要になるかもしれません
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 つの要素があります