Nicht im Skriptindex gefunden, bitte mit JSL abschließen. Vielen Dank!

Iwx228 bringt einen interessanten Wunschlisteneintrag hervor, auch wenn es sich bei dem bereitgestellten Beispiel nicht um den typischen JSL-Anwendungsfall handelt, bei dem es vom Benutzer ausgewählte Zeilen gibt.
Excel VBA verfügt über eine Tabellenkalkulationsmethode (Funktion), um eine globale Ersetzung durchzuführen.Die Funktionen „Substitute()“ und „Substitute Into()“ von JMP würden die Anforderungen dieses Benutzers ohne den Mehraufwand regulärer Ausdrücke erfüllen, da kein Muster erforderlich war, sondern nur eine globale Ersetzung. Es fehlt nur noch, es abzurufen und auf die aktuelle Auswahl anzuwenden. Die logische Syntax wäre
dt << Ersetzen( searchStr, replaceStr, Argumente für Auswahlen wählen entweder Zeilen und ausgewählte Spalten oder alle aus, oder.....)
Unten finden Sie ein Prototyp-Skript namens „ReplaceCell()“ mit Anwendungsbeispielen.
Ein paar Punkte, die Sie beachten sollten:
- Gilt für die aktuellen Daten. Wird abgebrochen, wenn keine aktuelle Datentabelle vorhanden ist.
- Wird abgebrochen, wenn keine Spalten ausgewählt sind. Wenn keine Zeilen ausgewählt sind, werden alle Zeilen in den ausgewählten Spalten verwendet.
- Wie geschrieben gilt diese Funktion nur für Zeichenspalten; Es kann mithilfe der Funktionen char() und num() auf numerische Spalten erweitert werden.
- Wird zeilenweise ersetzt, sodass die Schleife einmal erfolgt.
- Dies hätte per Spalte ziemlich schnell mit LFunc() erledigt werden können, was ich zuvor gepostet habe, aber ich wollte es einfach halten.
- Verwenden Sie Include() für JSL. Es ist nicht nötig, es zu einem Add-In zu machen, da STRG + F dies bereits tut
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;Das sind nicht alle Möglichkeiten, wie es in JSL codiert werden kann, um das zu erreichen, was Sie wollen, aber Ians Vorschlag ist das, was ich auch als Lösung vorgeschlagen hätte.
Dies ist das Ergebnis der Ersetzung. Im Fall von „Ganzem Zellenwert entsprechen“ ist das Mehrfach-Kontrollkästchen nicht aktiviert. Vielen Dank!

Wenn ich das richtig verstehe, erwägen Sie die Verwendung des JSL-Ausdrucks „Match()“. Ich habe den folgenden Code mithilfe von „Cols > Recode“ generiert:

und Überprüfen der JSL auf die resultierende Formelspalte. Und ja, JSL unterscheidet sich stark von VBA. Sie sollten einen Blick auf „Hilfe > Bücher > Skripthandbuch“ werfen und/oder eine Schulung in Betracht ziehen.
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 )
)
)
);Wenn dies der neue Fall ist, ist diese JSL nicht sehr effizient. Kann der Code für die neue Instanz verbessert werden? Danke schön!

Dies ist eine Möglichkeit, dies zu tun
dt = Current Data Table();
dt:class[dt << get rows where( dt:class == "A1" )] = "A9";
Ich habe versucht, JSL so zu schreiben, dass es nur mit perfekt passenden Ersetzungen funktioniert, aber wie schreibt man JSL, wenn man nicht nur ein paar Zeichen ersetzen möchte? Danke schön!

Du könntest benutzen Abonnieren der Datentabelle :
NamesDefaultToHere(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Wait(3);
maleRows = Loc(dt[0, "sex"], "M");
dt[maleRows, "sex"] = "boy";