从字符串中提取所有所需元素以启用多重响应分析你好! 我有来自 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 识别为多个响应的当前分隔符。 在这种情况下,替换功能也能很好地发挥作用。
回复:从字符串中提取所有所需元素以启用多重响应分析?