在腳本索引中未找到,請使用 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";