使用帶有空 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? 我什至無法用谷歌搜索這個,因為 {} 是谷歌不處理的特殊字符。 所以你可以明白我為什麼感到困惑。
我已經編寫了腳本的其餘部分,並且我相當有信心它在這一點上會出現一些小錯誤,所以如果我能夠克服這個障礙,那將會有很大幫助。 偽代碼在我的腦海中非常清晰,作為一個新的 JMP JSL 用戶,事情變得更加清晰,對此我很感激。 感謝大家的幫助!
麥克風
數據存取回复:使用帶有空 while 條件的 For 循環迭代關聯數組不起作用這是一些 CSV 格式的匿名數據(附後),包括相關列 ID、日期以及我有興趣使用的其他一些列。
讓我知道這是否有幫助。 我願意繼續對話,以幫助找到這個問題的答案。
麥克風
回复:使用帶有空 while 條件的 For 循環迭代關聯數組不起作用是的,請給我一點時間。 我必須快速匿名化所有數據和標識符......
麥克風
回复:使用帶有空 while 條件的 For 循環迭代關聯數組不起作用如果變量和列名稱相同,您將收到範圍錯誤消息。例如,您有一個列和一個名為 ID 的變量。還有查詢日期。
保留您的列名稱(更容易),並更改變量名稱。例如:ID 和 one_id、:query_date 和 one_query_date。
回复:使用帶有空 while 條件的 For 循環迭代關聯數組不起作用你能提供一個樣本數據表嗎?回复:使用帶有空 while 條件的 For 循環迭代關聯數組不起作用我在跑
dt1 << select where( :ID == ID );
theRows = dt1 << get selected rows;
Write(theRows);
只是為了檢查選擇 theRows 是否有效,但看起來我們還沒有做到這一點。 它打印:
[](0, 1)
對於循環中的每次迭代,它應該從數據表中打印非常全面的行(最多 20 列)。 我不知道發生了什麼事。
為了嘗試幫助回答您隱含的問題,theRows 只是一個臨時變量,用於查找與循環中指定的值匹配的 ID 列值所產生的行(由於 ID 的多個副本,可能存在多行這種性質)。
我意識到這很令人困惑……但這也是我掙扎的原因。
提前致謝,
麥克風
回复:使用帶有空 while 條件的 For 循環迭代關聯數組不起作用好吧……我猜的。您表示您需要找到 query_date,並且它似乎與您的 SelectWhere() 有關。所以我猜測在您的數據表中,有一個名為 query_date 的列,並且 SelectWhere() 或 Get RowsWhere() 將返回具有所需查詢日期的行。顯然我對在哪裡可以找到查詢日期的猜測是錯誤的。
回复:使用帶有空 while 條件的 For 循環迭代關聯數組不起作用嗨克雷格。 這似乎有效。 非常感謝。
邁克爾
回复:使用帶有空 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/*###*/
我通常會自己解決這個問題,但事實證明這個問題非常具有挑戰性,所以我不完全確定。
非常感謝,
麥克風
回复:使用帶有空 while 條件的 For 循環迭代關聯數組不起作用謝謝你,吉姆。 你的快速反應真是太好了。 我很感激。 現在是周末,請給我一點時間來再次解析所有這些內容。
麥克風回复:使用帶有空 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);
SelectWhere() 執行操作,但不返回任何內容。因此query_date沒有值。SelectWhere() 的作用是將數據表中滿足選擇條件的所有行的選定行狀態設置為“打開”。如果數據表中有不止一行具有 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 RowsWhere()。
query_date = dt1:query_date[ dt1 << get rows where( :ID == ID )[1] ];
我希望我能有所幫助而不是造成混亂。請繼續提問。
回复:使用帶有空 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 個元素