從字串中提取所有所需元素以啟用多重回應分析你好! 我有來自 SharePoint 的數據,我們使用這些數據(除其他外)來追蹤用於解決問題的工具/技術。 這包括 JMP,順便說一句。資料(在一列中)遵循這種類型的 ; 分隔格式:
<技術描述>;#<技術 ID>;<技術描述>;#<技術 ID>;<技術描述>;#<技術 ID>...
3.4 離線最佳化與模擬工具;#15;#3.9 模擬;#30;#4.6 物料平衡;#22
表中的每一行(已解決的問題)可以有一個或多個<技術 ID>。 有時 以 # 開頭,有時則不然。 但<技術 ID> 前面總是帶有 #。
我想解析 的字串和多重回應分析的格式:15、30、22(上面的範例)。
- 有 ~100 個 ,因此建立 ~100 個稀疏列似乎很浪費。範例資料檔 Failures3Delimited.jmp 中使用的方法是解決此問題的最有效方法嗎?
- 我已經開始學習 REGEX 並且已經能夠找到 的一次出現,但不是全部。 我需要一個循環嗎? 有其他方法可以做到這一點嗎?
謝謝。 使用 JMP17.1 Pro。
自動化和腳本編寫資料混合與清理回覆:從字串中提取所有所需元素以啟用多重回應分析這是我想出來的一個可能的解決方案:

這是我使用的公式
i = 1;
string = "";
While( Word( i, :Input, "#;" ) != "",
theWord = Word( i, :Input, "#;" );
If( Is Missing( Num( theWord ) ) == 0,
string = string || "," || theWord
);
i++;
);
Try( Substr( string, 2 ) );
回覆:從字串中提取所有所需元素以啟用多重回應分析非常優雅 - 而不是複雜的分割第一秒(兩次相同的分隔符號)或某些部分是文本,只需:
找到數字:)
希望沒有 ID #30-2 ...
或描述:42
New Column( "IDs",
Character,
"Multiple Response",
Formula(
Concat Items(
Transform Each( {theWord}, Words( :Input, ";#" ),
Char( Num( theWord ) )
),
""
)
),
Set Property( "Multiple Response", Multiple Response( Separator( "." ) ) ),
)
回覆:從字串中提取所有所需元素以啟用多重回應分析不會建議使用JMP 的字元模式因為它相當難以理解(至少是所有不同的功能),但我確實設法(也許)使用它來做到這一點
Names Default To Here(1);
str = "3.4 Offline Optimization & Simulation Tools;#15;#3.9 Simulation;#30;#4.6 Material Balance;#22";
idlist2 = {};
resval = "";
Pat Match(str, Pat Span("#") + Pat Regex("\d+?") >> next_id + Pat Regex("(;|$)") + Pat Test(
Insert Into(idlist2, next_id); resval = Concat Items(idlist2, ", "))
);
show(idlist2, resval);
這是在公式中使用它的範例
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(1),
Compress File When Saved(1),
New Column("Column 1",
Character,
"Nominal",
Set Values(
{
"3.4 Offline Optimization & Simulation Tools;#15;#3.9 Simulation;#30;#4.6 Material Balance;#22"
}
)
),
New Column("Column 2",
Character,
"Multiple Response",
Formula(
idlist2 = {};
resval = "";
Pat Match(
:Column 1,
Pat Span("#") + Pat Immediate(Pat Regex("\d+?"), next_id)
+Pat Regex("(;|$)") + Pat Test(
Insert Into(idlist2, next_id);
resval = Concat Items(idlist2, ", ");
)
);
resval;
),
Set Property("Multiple Response", Multiple Response(Separator(",")))
)
)回覆:從字串中提取所有所需元素以啟用多重回應分析謝謝,吉姆! 我在想某種循環可以解決這個問題,無論有沒有正規表示式。 希望你一切都好!
回覆:從字串中提取所有所需元素以啟用多重回應分析雅爾莫:感謝您的努力! 我閱讀了腳本手冊中的 REGEX 和 Pat Match 部分,並決定除非絕對必要,否則不嘗試 Pat Match...
回覆:從字串中提取所有所需元素以啟用多重回應分析hogi:感謝您的提交! 我以前使用過 Words(),但我沒有想到它,因為我很早就說服自己,我必須尋求 REGEX 解決方案。 這個解決方案非常優雅! 我需要閱讀 Concat Items()...
Jim/Jarmo/hogi:你們展示了社區的全球力量! 我現在坐在吉隆坡。 我早上第一件事就是在你可能要睡覺/已經睡覺的時候發布的。 下午晚些時候我從你那裡得到了解決方案。 再次感謝你!
回覆:從字串中提取所有所需元素以啟用多重回應分析@hogi寫道:
....複雜的分割第一秒...
實際上 - 沒有我想像的那麼複雜:)
New Column( "IDs",
Character,
"Multiple Response",
Formula(
splitItems = Words( :Input, ";#" );
Concat Items( splitItems[2:: N Items( splitItems ):: 2], "," );
)
)
...Jmp 的下一個版本將使這變得更加容易:
https://community.jmp.com/t5/JMP-Wish-List/new-slicing-options-for-matrices/idc-p/614326/highlight/true#M4057
回覆:從字串中提取所有所需元素以啟用多重回應分析必要的變更是將一個 JMP 識別為多個回應的目前分隔符號。 在這種情況下,替換功能也能很好地發揮作用。
回覆:從字串中提取所有所需元素以啟用多重回應分析?