JMP脚本中重复连接/更新的最佳实践大家好,
I’m running a JSL script that performs Update/Join operations between calculation tables and filtered data tables. I noticed the following behavior:
-
当脚本多次运行时,JMP 会自动重命名重复的列以避免名称冲突,例如:
<SPAN><SPAN class="hljs-title class_">批号</SPAN><SPAN class="hljs-title class_">-</SPAN><SPAN class="hljs-number">表</SPAN>1 的<SPAN class="hljs-title class_">批号</SPAN><SPAN class="hljs-number">,</SPAN><SPAN class="hljs-keyword">表</SPAN><SPAN class="hljs-title class_">2</SPAN><SPAN class="hljs-title class_">的</SPAN><SPAN class="hljs-title class_">批号</SPAN></SPAN>
-
即使我从面板中关闭表格,变量(列对象)仍然存在于内存中,因此重新运行脚本会创建额外的重复列。
-
我目前的解决方法是在运行脚本之前退出 JMP 并重新启动,以防止出现重复列。
向社区提出的问题:
-
Are there best practices for repeated Update or Join operations that avoid generating duplicate columns?
-
是否有推荐的方法在脚本运行后“清理”表/变量,以防止后续运行创建重复项?
-
是否有函数或 JSL 模式可以安全地重命名或覆盖列,而不会生成额外的副本?
任何建议或策略都将不胜感激!
我也尝试过用这段代码动态处理它们,但是没有成功。
RenameColumn = Function({dt, oldNamePattern, newName},
colList = dt << Get Column Names; // returns a column list object
n = N Items(colList); // number of columns
For(i = 1, i <= n, i++,
c = colList[i]; // get the column name as string
If(Contains(c, oldNamePattern),
Column(dt, c) << Set Name(newName);
Break(); // optional: stop after first match
);
);
);
自动化和脚本编写回复:JMP脚本中重复连接/更新的最佳实践您希望如何处理这些列?如果它们已经存在,请不要更新/重新添加它们。您能否提供一些示例脚本和数据供社区成员参考?
回复:JMP脚本中重复连接/更新的最佳实践我很想了解所描述的问题的具体细节。
特别是,变量(列对象)仍然存在于内存中,因此重新运行脚本会创建额外的重复列。
此外,请注意:
对于 Tables/Update 操作,此类问题是由 JMP19 中的一项新功能引起的:
允许更新平台在待更新的表中已存在新列的情况下创建新列。
新增功能固然很酷,但人们却没有考虑到其附带影响!
附带效应:
在 JMP19 中,已无法再在以下模式下使用该功能:
“请添加目标表中尚不存在的列”。
更多详情:表格/更新已更改!
脚本的行为有所不同,用户会得到类似这样的表格:
(这些额外的列毫无用处,只会污染表格)

我希望开发人员能够理解这个问题,并在下一个版本中修复它。
可能的解决方案:2 种模式
自动表格/更新
- 使用新方法,并添加一个(带后缀的)列,如果(!!!!)用户选择了该列。

- 不要在“全部”模式下使用此技巧:

-> 将再次允许
“添加目标表中尚不存在的列”
(就像以前的 JMP 版本一样)。
另一种选择:增加一个设置来启用/禁用新模式。
为保证向后兼容性:默认情况下禁用此设置。
回复:JMP脚本中重复连接/更新的最佳实践听起来你需要使用 Join 函数中的“输出列”功能,这样就不会引入重复数据。除非你引入了同名列,否则使用“输出列”功能不会在列名后添加“... 来自表 2”的后缀。
在更新过程中,您可以选择要添加的列,这样就不会引入重复的列名。
回复:JMP脚本中重复连接/更新的最佳实践代码:
// Filtering Table A using RequiredBatches
FilteredA = TableA << Join(
With(RequiredBatches),
By Matching Columns(:Batch Number = :Batch Number),
Drop Multiples(0,0),
Include Matches(0,0),
Output Table("FilteredA"),
Invisible(0)
);
// Filtering Table B using RequiredBatches
FilteredB = TableB << Join(
With(RequiredBatches),
By Matching Columns(:Batch Number = :Batch Number),
Drop Multiples(0,0),
Include Nonmatches(0,0),
Output Table("FilteredB"),
Prevent Name Collision(1),
Invisible(0)
);
// Rename joined key columns
Column(FilteredA, "Batch Number of TableA") << Set Name("Batch Number");
Column(FilteredB, "Batch Number of TableB") << Set Name("Batch Number");
如果我不重启 JMP 就再次运行此脚本,则会发生以下情况:
FilteredA → FilteredA 2
FilteredB → FilteredB 2
我也尝试过在脚本开头使用 for all tables,这在 Mac 上似乎可以正常工作,因为我没有遇到任何问题,但在 Windows 上,我认为它不起作用,或者我对它的行为感到非常困惑。
Try(TableA << Close(No Save));
即使我使用脚本中的“关闭除此以外的所有窗口”选项从 JMP 主页窗口列表中关闭了表格所在的窗口,表格虽然关闭了,但变量可能仍然保留在内存中。所以,我不知道该如何处理这个问题?
这样会有帮助吗?或者还有其他不需要重新利用代码的方法吗?:(
回复:JMP脚本中重复连接/更新的最佳实践在哪里?
Prevent Name Collision(1)
来自哪里?
在 JMP Join 平台中以交互方式执行连接操作,确保预览效果符合预期,运行该操作并从增强日志中复制脚本。
回复:JMP脚本中重复连接/更新的最佳实践您是否尝试过启用“使用第二个表中的数据更新主表”功能?

[不新增列 - 更新任何匹配的行]
或者“匹配同名列”?

[与第一个类似,但增加了新的列。]
回复:JMP脚本中重复连接/更新的最佳实践yes, but this would be impractical for large list of columns</CODE></P>
</LINGO-BODY>
<LINGO-SUB id="lingo-sub-914649" slang="en-US" mode="CREATE" translate="no">回复:JMP脚本中重复连接/更新的最佳实践</LINGO-SUB>
<LINGO-BODY id="lingo-body-914649" slang="en-US" mode="CREATE">
<BLOCKQUOTE>
<HR />
<A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/63230" target="_blank">@zetaVagabond1</A> wrote:
<BR />
<P>yes, but this would be impractical for large list of columns<CODE class=" language-jsl">
这是对……的回复?