Corrispondenza del modelloCIAO,
Sto cercando di sostituire parte del testo e gradirei un aiuto con il codice.
Ho notato che l'esecuzione di jsl con la vecchia sintassi dei nomi di colonna richiede un certo tempo di esecuzione.
Vorrei creare uno script che prenda il mio codice jsl attuale e lo modifichi da questo:
:Name( "col_name" )
A questo:
:"col_name"n
Ho provato a usare Regex e Patt Match ma senza successo.
Qualcuno sa come fare?
Automazione e scriptingRi: Corrispondenza modelloStai provando a farlo con Search Script?

Dopo la sostituzione

:Name\( (.+?) \)
:\1n
Ri: Corrispondenza modelloNo, sto cercando di fare esattamente la stessa cosa con le funzioni Regex o Patt Match.
Ri: Corrispondenza modelloDopo aver provato T/S per alcuni giorni, ho scoperto che non c'è modo di farlo in JSL senza perdere i commenti all'interno del codice JSL che viene riscritto.
Quindi ho scritto un codice in python che fa lo stesso
# This code will replace code in .jsl files that match the Regex in parameters dictionary (pattern(1) and repl(2)) below.
# It is based on the simple def replace(source, dest) function, with pattern now being the source and the repl as the dest.
# The pattern in this code is to replace old JMP column naming syntax to the new JMP column naming syntax,
# e.g :Name( "variable@property" ) into :"variable@property"n
# for jsl code to run more efficiently in JMP17 and above
import os
import re
import tkinter as tk
from tkinter import filedialog
root = tk.Tk()
root.withdraw()
WORKING_DIR = filedialog.askdirectory()
# pattern(1)
pattern = r':\s*Name\s*\(\s*"([^"]+)"\s*\)'
# repl(2)
repl = r':"\1"n'
parameters = {pattern: repl}
def pat_replace(pat, rep):
for dname, dirs, files in os.walk(WORKING_DIR):
for fname in files:
if fname.endswith(".jsl"):
fpath = os.path.join(dname, fname)
with open(fpath, encoding="utf8") as f:
s = f.read()
s_out = re.sub(pat, rep, s)
with open(fpath, "w", encoding="utf8") as f:
f.write(s_out)
for i, (key, value) in enumerate(parameters.items()):
pat_replace(key, value)Ri: Corrispondenza modelloSe hai uno script come questo
Names Default To Here(1);
// this is comment
:Name("col_name");
:Name("col_name2");
Puoi sicuramente sostituire le stringhe di tipo :Name("colname") senza rimuovere i commenti.
Script.jsl

Script2.jsl

Names Default To Here(1);
path_to_file = "$DOWNLOADS/Script.jsl";
path_to_new_file = "$DOWNLOADS/Script2.jsl";
str = Load Text File(path_to_file);
new_str = Regex(str, ":Name\( (.+?) \)", ":\1n", GLOBALREPLACE);
// Write(new_str);
Save Text File(path_to_new_file, new_str);
Ri: Corrispondenza modello...e lo script completo potrebbe apparire così
WORKING_DIR = Pick Directory( "Select a directory" );
pattern = "\[:\s*Name\s*\(\s*"([^"]+)"\s*\)]\";
rep = "\[:"\1"n]\";
pat_replace = Function( {pat, rep},
For Each( {f}, Files In Directory( WORKING_DIR, recursive(1) ),
If( Ends With( f, ".jsl" ),
f = WORKING_DIR || f;
text = Load Text File( f );
newtext = Regex( text, pat, rep, GLOBALREPLACE );
If( newtext != text,
Save Text File( f || ".new.jsl", newtext );
);
)
)
);
pat_replace( pattern, rep );
/*
the "\[...]\" escape in JSL is NOT a perfect replacement for the
python r-string, though it does work for this example. In particular,
if the regex contains ]\ it will not work out without more escaping
magic.
The file is renamed when saved so if something goes wrong...you could
save to another directory, etc.
Recursive(1) includes subdirs, change as needed.
*/