將數組轉換為字符串大家好,
我試圖從另一個表的數組中獲取一個值,並將其用作我選擇的值。 有沒有辦法將數組轉換為字符串?
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
merged_file << select where(:Name_final==name_key);
數據表其他腳本編寫回复:將數組轉換為字符串我想這會給你你想要的
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
merged_file << select where(nrows(loc(name_key,:Name_final))>0);
回复:將數組轉換為字符串再次驚嘆於吉姆直擊問題核心的能力。 這裡有兩個不錯的代碼值得更長的解釋:
這有什麼作用?
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
ref_file_1是數據表引用, “名稱”是作為字符串的列名稱(字面意思是“NAME”,但可以在變量中),並且柱子函數返回一個列引用。 這<<獲取值message 從列中獲取所有值,包括重複項。 這關聯數組函數創建一組唯一值,並且<<獲取鑰匙消息返回唯一值。 (做得很好@jshvt17 .)
和這個?
merged_file << select where(nrows(loc(name_key,:Name_final))>0);
這<<選擇哪裡消息對每一行進行操作合併文件, 一次一個並在參數非零時選擇行。
這位置()函數返回一個索引矩陣。 它在列表中搜索name_key對於 :Name_final 的出現。 結果矩陣可以有零行或多行,但在本例中它將有 0 或 1 行,因為鍵是唯一的。 這行()函數返回 0 或 1,然後比較 >0 並保持為 0 或 1。 因此,如果 :Name_final 在 ref_file_1:NAME 的列表中,則選擇行。
選擇:
如果 name_key 中有 >1e6 個名稱,merge_file 中有 >1e7 行怎麼辦? 表演會是什麼樣子? loc 函數將進行大量搜索。 它將比較 1e13 字符串。 你會厭倦等待。 解決方法是使用這樣的關聯數組:
nameSet = associative array(column(ref_file_1, "NAME") << get values);
merged_file << select where(contains(nameSet, :Name_final));
現在 nameSet 中只有 1e7 次查找。 它們不是免費的,但比順序檢查 1e6 項要快得多。 我猜每個大約有 20 個比較(log2(1e6))。 這對於下一個維護者來說也可能更容易遵循。
(未經測試。 歡迎指正!)
回复:將數組轉換為字符串克雷格,
我再一次學到了一些關於 JMP 的新知識。我最初使用 Contains() 函數編寫代碼,但後來轉換為使用 Loc() 函數,因為我認為這是一個問題
Contains( "BARBARA ANN", "BARBARA")
返回一個 True。
我有(事實證明是錯誤的)如果包含的比較組件是項目的 JMP 列表,
Contains( {"BARBARA ANN", "BETTY", "DAVID"}, "BARBARA")
也會返回一個 True,但是,它返回一個 False,這意味著它進行了絕對匹配。
謝謝你的好信息