Coincidencia de patronesHola,
Estoy intentando reemplazar parte del texto y agradecería ayuda con el código.
Noté que ejecutar jsl con una sintaxis de nombre de columna antigua afecta el tiempo de ejecución.
Me gustaría crear un script que tome mi código jsl actual y lo cambie de esto:
:Name( "col_name" )
A esto:
:"col_name"n
Intenté usar Regex y Patt Match sin suerte.
¿Alguien sabe cómo hacer esto?
Automatización y scriptingRe: Coincidencia de patrones¿Estás intentando hacer esto con el script de búsqueda?

Después de reemplazar

:Name\( (.+?) \)
:\1n
Re: Coincidencia de patronesNo, estoy intentando hacer exactamente lo mismo con las funciones Regex o Patt Match.
Re: Coincidencia de patronesDespués de probar durante unos días, descubrí que no hay forma de hacer esto en jsl sin perder los comentarios dentro del código jsl que se está reescribiendo.
Así que escribí un código en Python que hace eso en su lugar.
# 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)Re: Coincidencia de patronesSi tienes un script como este
Names Default To Here(1);
// this is comment
:Name("col_name");
:Name("col_name2");
Definitivamente puedes reemplazar esas cadenas de tipo :Name("colname") sin eliminar los comentarios.
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);
Re: Coincidencia de patrones...y el guión completo podría verse así
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.
*/