Correspondance de motifsSalut,
J'essaie de remplacer une partie du texte et j'apprécierais de l'aide avec le code.
J'ai remarqué que l'exécution de jsl avec une ancienne syntaxe de nom de colonne a un impact sur le temps d'exécution.
Je voudrais créer un script qui prend mon code jsl actuel et le modifie à partir de ceci :
:Name( "col_name" )
À cela :
:"col_name"n
J'ai essayé d'utiliser Regex et Patt Match sans succès.
Est-ce que quelqu'un sait comment faire ça ?
Automatisation et scriptsRe: Correspondance de motifsEssayez-vous de faire cela avec Search Script ?

Après remplacement

:Name\( (.+?) \)
:\1n
Re: Correspondance de motifsNon, j'essaie de faire exactement la même chose avec les fonctions Regex ou Patt Match.
Re: Correspondance de motifsAprès T/S pendant quelques jours, j'ai découvert qu'il n'y avait aucun moyen de faire cela en jsl sans perdre les commentaires dans le code jsl en cours de réécriture.
J'ai donc écrit un code en Python qui fait ça à la place
# 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: Correspondance de motifsSi vous avez un script comme celui-ci
Names Default To Here(1);
// this is comment
:Name("col_name");
:Name("col_name2");
Vous pouvez certainement remplacer ces chaînes de type :Name("colname") sans supprimer les commentaires.
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: Correspondance de motifs...et le script complet pourrait ressembler à ceci
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.
*/