在脚本索引中未找到,请使用 JSL 完成。非常感谢!

Iwx228 提出了一个有趣的愿望清单项,尽管提供的示例不是典型的 JSL 用例,其中有用户选择的行。
Excel VBA 有一个电子表格方法(函数)来进行全局替换。JMP 的 Substitute() 和 Substitute Into() 函数可以满足用户的需求,而无需正则表达式的开销,因为不需要模式,只需全局替换。 所缺少的只是获取并将其应用到当前选择。 逻辑语法是
dt << Replace(searchStr,replaceStr,选择的参数选择行和选定的列或全部,或......)
下面是一个名为 ReplaceCell() 的原型脚本以及使用示例。
有几点需要注意:
- 适用于当前数据。 如果没有当前数据表则中止。
- 如果没有选定的列则中止。 如果没有选定的行,则使用选定列中的所有行。
- 正如所写,此函数仅适用于字符列;通过使用 char() 和 num() 函数,它可以扩展到数字列。
- 按行替换,因此循环发生一次。
- 这可以通过我之前发布的 LFunc() 专栏相当快地完成,但希望保持简单。
- 对 JSL 使用 Include()。 无需将其设为外接程序,因为 CTRL + F 已执行此操作
ReplaceCell = Function({src,rpl},{cdt, scol, srow, i, j, val},
if(ntable()>0, cdt=current data table(), throw("no table available"));
scol = cdt << get selected columns;
if(nitems(scol) ==0, throw("no columns are selected...aborting"));
srow = cdt << get selected rows();
if (nrow(srow)==0, srow = Transpose(1::nrow(cdt)) ); //if no rows are selected, assume the entire column.
for(i=1, i<=nrow(srow), i++,
for(j=1, j<=nitems(scol), j++,
val = scol[j][srow[i]];
if( IsString(val), scol[j][srow[i]] = Substitute(val, src, rpl) )
);
)//end for i
); //end function
//test cases create a new table with 2 selected columns
ndt = New Table( "Test 1",
Add Rows( 10 ),
New Column( "A",
Character,
"Nominal",
Set Values(
{"A7", "B7", "C7", "D7", "E7", "F7", "G7", "A9", "A79", "A707"}
)
),
New Column( "B",
Character,
"Nominal",
Set Values(
{"M7", "M77", "M07", "MX7", "E7", "E2", "E3", "F9", "G27", "M99"}
)
)
);
//replace all 7's with 1's
ReplaceCell("7","1"); //aborts no selected columns
ndt:A << set selected(1);
ndt:B << set selected(1);
//replace all 7's with 1's
ReplaceCell("7","1");
ndt << bring window to front;
//now try it with selected rows
ndt << select rows([1,2,4,7,9,10]);
ReplaceCell("1","6");
ndt << bring window to front;这并不是在 JSL 中编码来完成您想要的事情的所有方法,但 Ian 的建议也是我建议的解决方案。
这是在“匹配整个单元格值”未选中多个复选框的情况下替换的结果。谢谢!

如果我理解正确,请考虑使用“Match()”JSL 表达式。 我使用“Cols > Recode”生成了以下代码:

并检查 JSL 中的结果公式列。 而且,“是的”,JSL 与 VBA 有很大不同。 您应该查看“帮助>书籍>脚本指南”和/或考虑一些培训。
NamesDefaultToHere(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Wait(3);
dt << New Column( "Age 2",
Character,
"Ordinal",
Formula(
Match( :age,
12, "Twelve",
13, "Thirteen",
14, "Fourteen",
15, "Fifteen",
16, "Sixteen",
17, "Seventeen",
Format( :age, "Fixed Dec", 5, 0 )
)
)
);如果这是新情况,则此 JSL 效率不高。可以针对新实例改进代码吗?谢谢你!

这是一种方法
dt = Current Data Table();
dt:class[dt << get rows where( dt:class == "A1" )] = "A9";
我尝试过以仅适用于完美匹配替换的方式编写 JSL,但如果您不想只替换几个字符,那么如何编写 JSL?谢谢你!

你可以使用数据表下标:
NamesDefaultToHere(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Wait(3);
maleRows = Loc(dt[0, "sex"], "M");
dt[maleRows, "sex"] = "boy";