Non trovato nell'indice dello script, termina con JSL. Grazie mille!

Iwx228 fa apparire un interessante elemento della lista dei desideri, sebbene l'esempio fornito non sia il tipico caso d'uso JSL, in cui sono presenti righe selezionate dall'utente.
Excel VBA dispone di un metodo (funzione) del foglio di calcolo per eseguire una sostituzione globale.Le funzioni Substitute() e Substitute Into() di JMP avrebbero soddisfatto le esigenze degli utenti senza il sovraccarico delle espressioni regolari, poiché non era richiesto un modello, ma solo la sostituzione globale. Tutto ciò che manca è ottenerlo e applicarlo alle selezioni correnti. La sintassi logica sarebbe
dt << Sostituisci( searchStr, replaceStr, argomenti per le selezioni seleziona le righe e le colonne selezionate oppure tutto oppure.....)
Di seguito è riportato uno script prototipo chiamato replaceCell() con esempi di utilizzo.
Alcuni elementi da notare:
- Si applica ai dati attuali. Interrompe se non esiste una tabella dati corrente.
- Interrompe se nessuna colonna selezionata. Se non ci sono righe selezionate, verranno utilizzate tutte le righe nelle colonne selezionate.
- Come scritto questa funzione si applica solo alle colonne Caratteri; può essere esteso alle colonne numeriche, utilizzando le funzioni char() e num().
- Sostituisce per riga, quindi il loop avviene una volta.
- Questo avrebbe potuto essere fatto per colonna abbastanza rapidamente con LFunc() che ho pubblicato in precedenza, ma volevo mantenerlo semplice.
- Utilizzare Include() per JSL. Non è necessario renderlo un componente aggiuntivo poiché CTRL + F lo fa già
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;Non sono tutti i modi in cui può essere codificato in JSL per ottenere ciò che desideri, ma il suggerimento di Ian è quello che avrei suggerito anche come soluzione.
Questo è il risultato della sostituzione nel caso di "Abbina l'intero valore della cella" la casella di controllo multipla non è selezionata. Grazie!

Se ho capito bene, considera l'utilizzo dell'espressione JSL "Match()". Ho generato il codice seguente utilizzando 'Cols > Recode':

e ispezionando il JSL per la colonna formula risultante. E, "sì", JSL è molto diverso da VBA. Dovresti consultare 'Aiuto > Libri > Guida allo scripting' e/o prendere in considerazione un po' di formazione.
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 )
)
)
);Se questo è il nuovo caso, questo JSL non è molto efficiente. È possibile migliorare il codice per la nuova istanza? Grazie!

Questo è un modo per farlo
dt = Current Data Table();
dt:class[dt << get rows where( dt:class == "A1" )] = "A9";
Ho provato a scrivere JSL in un modo che funzioni solo con sostituzioni perfettamente abbinate, ma se non vuoi sostituire solo pochi caratteri, come scrivi JSL? Grazie!

Potresti usare abbonamento alla tabella dati :
NamesDefaultToHere(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Wait(3);
maleRows = Loc(dt[0, "sex"], "M");
dt[maleRows, "sex"] = "boy";