如何替换空行直到下一个条目(并继续)?亲爱的 JMP 社区,
(W10、64 位、JMP 15.0 专业版)
我有一个从 Excel 文件导入的大型数据表,并且需要在列的空行中填充上一个列表的条目。 我正在尝试编写 JSL 从左侧的一列转到右侧的一列,如下所示:

我认为编码应该很容易,但我遇到的问题是正确地停止在前一个产品的末尾并从新产品开始。 我一定没有正确循环。
欢迎任何建议/帮助。
谢谢!,
DS
回复:如何替换空行直到下一个条目(并继续)?几位 JMP 系统工程师反复研究这个问题,这是最好的解决方案。 @Brady Brady 的最终版本比我们开始使用的简单公式更快、更稳健。 我已经使用它很多年了,发现它在很多情况下都能很好地工作。 很高兴它对你有效!
回复:如何替换空行直到下一个条目(并继续)?你好@Byron_JMP ,
感谢您在上一篇文章中提供的脚本调整代码。 这个比我的解决方案更好,因为它检查列中的第一个条目是否丢失,如果缺少,它将用下一个现有条目替换它,我发现这种情况发生在我引入的几个导入中。 我对那里的一些脚本解决方案没有经验,例如如何使用 vec 和矩阵信息来搜索某些内容。 不管怎样,我把它应用到了我的具体问题上,并且毫无问题地解决了它。
谢谢!,
DS
回复:如何替换空行直到下一个条目(并继续)?我找不到执行相同操作的 JSL 函数或消息。 我认为它不存在。 有一个 Main Menu() 函数,但该命令与所选列关联,而不是与 JMP 主菜单关联。
回复:如何替换空行直到下一个条目(并继续)?我不知道交互式解决方案背后的 JSL 代码。 这应该没问题,因为你有多种选择。
我确实知道交互式解决方案与某些脚本一样可以同时应用于多个列。 只需选择所有列并右键单击,选择“填充”选项即可。
回复:如何替换空行直到下一个条目(并继续)?这些是一些 JSL 注释,如果您正在编写解决方案脚本,它们将为您提供帮助
//better version of Fill in Missing Cells, by Brady Brady
Names Default To Here( 1 );
dt = Current Data Table();
dtcollist = dt << get column names;
dlg = Dialog( "Select Column", vlist( selection = List Box( dtcollist ), button( "OK" ) ) );
Remove From( dlg, 2 );
Eval List( dlg );
dtMat = (dt << Get All Columns As Matrix);
For( i = 1, i <= N Items( selection ), i++,
colNum = Contains( dtColList, Name Expr( selection[i] ) );
vMat = dtMat[0, colNum];
mis = Loc( Is Missing( vMat ) );
If( N Row( mis ),
col = column(selection[i]);
If( mis[1] == 1,
col[1] = col[(Loc( vMat ))[1]]
);
For( j = if(mis[1]==1, 2, 1), j <= N Row( mis ), j++,
col[mis[j]] = col[mis[j] - 1]
);
);
);
///////////////////////////// short tweak for scripting
dtcollist=dtnr<<GET column="" names=""></GET>
回复:如何替换空行直到下一个条目(并继续)?有一个非常棒的插件,一个必须具备的插件数据表工具
那里有一个插值工具可以做到这一点,还有更多。 而且它比大桌子上的公式快得多。

回复:如何替换空行直到下一个条目(并继续)?你好@丹_奥伯米勒,
感谢您对此的提醒。 我见过“填充到末尾”、“到行”或“填充”模式,但以前没有见过。
您知道执行此操作的 JSL 代码吗? 我问的原因是我希望这一切都在 JSL 代码中,因为我正在读取多个文件来构建一个大型数据表,并且需要自动化该过程,以便最终用户只需运行脚本并输出他们的表,其中没有缺失值产品。 如果它比我的解决方案更快、更优雅,我想修改代码并将其插入到我的脚本中。
谢谢!,
DS
回复:如何替换空行直到下一个条目(并继续)?您有一个可以完成这项工作的脚本,但也有一个交互式解决方案。 选择需要替换的列,以便选择所有行。 右键单击该列的数据网格,然后选择填充 > 用以前的值替换缺失值。

回复:如何替换空行直到下一个条目(并继续)?你好@蒂埃里_S ,
您的公式可能会起作用,但我无法让它与我拥有的特定表格完美配合。 我发现的一个问题是,有时我有几行一个接一个地更改产品,并且滞后不起作用。
我确实想出了这段代码,它运行得很好。 它不是很优雅,但是很有效!
感谢您的帮助!,
DS
RowReplace = dt << Get Rows Where( :Product != "" );
RowEnd = RowReplace;
Remove From( RowEnd, RowEnd[1] );
Insert Into( RowEnd, N Rows( dt ) );
For( l = 1, l <= N Items( RowReplace ), l++,
For( irow = 2, irow <= RowEnd[l], irow++,
If( Is Missing( :Product[irow] ) == 1,
:Product[irow] = :Product[RowReplace[l]],
)
)
);
回复:如何替换空行直到下一个条目(并继续)?嗨,这是一个简单的公式来解决这个问题
If( Is Missing( :Column 1 ),
Lag( :Column 2, 1 ),
:Column 1
)
最好的,
TS