Script para copiar el código del archivo de script en un archivo de texto y luego poder leerlo¡Hola grupo de usuarios!
Tenía una pregunta sobre cómo crear un script que 1: recorra una carpeta con varios scripts, copie el nombre del archivo de script y luego copie el script mismo debajo del nombre en un archivo de texto y concatene este archivo con todos los scripts de la carpeta. 2: Permita leer el texto del archivo de texto y crear nuevos archivos de script en una carpeta seleccionada. Puedo crear la interfaz de usuario para elegir qué hacer (guardar o leer) y seleccionar las carpetas sin problemas, pero no estoy seguro de cómo guardar el nombre del archivo y el script en el archivo de texto o leerlo.
Entonces, por ejemplo, el archivo de texto que se habría creado se vería así:
guión uno
los nombres por defecto están aquí(1);
dt1=tabla de datos actual();
guión dos
los nombres por defecto están aquí(1);
dt2=tabla de datos actual();
guión 3
los nombres por defecto están aquí(1);
dt3=tabla de datos actual();
y cuando se lee, se generan tres archivos de script, cada uno conteniendo el código que estaba debajo del nombre del archivo en el archivo de texto.
Cualquier sugerencia sería apreciada.
Automatización y scriptingRe: Script para copiar el código del archivo de script en un archivo de texto y luego poder leerlo¿Existe alguna razón específica para combinar los scripts de esta manera en lugar de utilizar Include?
Crear el archivo de texto es sencillo, a continuación se muestra un ejemplo.
Names Default To Here(1);
path = "folder/";
path = Convert File Path(path, "windows");
scriptfiles = Files In Directory(path);
scripts = {};
For Each({filename}, scriptfiles,
If(!Ends With(filename, ".jsl"),
continue();
);
Insert Into(scripts, "//" || filename);
Insert Into(scripts, Load Text File(path || filename));
);
txt = Concat Items(scripts, "\!N");
Save Text File(path || "total.jsl", txt, mode("replace"));
Pero crear los archivos de script podría no ser tan fácil. ¿Cómo se diferencia entre JSL y el nombre del archivo? ¿Tiene nombres de archivo muy específicos?
Re: Script para copiar el código del archivo de script en un archivo de texto y luego poder leerlo¡Gracias @jthi , esto funcionó bastante bien!
Cambié el inicio de un archivo a un texto más distintivo de "//##" por lo que ahora el archivo de texto se ve así
//##etiqueta script.jsl
//rev 5-9-25
los nombres por defecto están aquí(1);
dt=tabla de datos actual();
filas_seleccionadas=dt<
//##Hacer un PDF de una tabla de datos.jsl
etc......
Ahora sabría que //## indica el inicio de un nuevo archivo de script y que el nombre del archivo se encuentra entre //## y .jsl. También sabría que entre .jsl y el siguiente //## está el texto del script. Parece que todos los identificadores están ahí. Me pregunto si hay alguna forma en JSL de leer el código de esta manera que permita aprovechar estos identificadores para reconstruir los archivos, o si tendría que realizar esa parte en otro programa.
¡Gracias por cualquier comentario adicional!
Re: Script para copiar el código del archivo de script en un archivo de texto y luego poder leerloEsto no difiere mucho del análisis de texto y se puede hacer fácilmente con JSL. Si suponemos que hemos combinado un archivo como este...
//##label script.jsl
//rev 5-9-25
names default to here(1);
dt=current datatable();
selected_rows=dt<
<GET selected="" rows=""></GET>
<P>y debe estar separado en etiqueta script.jsl y Hacer un PDF de una tabla de datos.jsl, yo haría algo como esto</P> <CODE class=" language-jsl">Names Default To Here(1);
path = "$DOWNLOADS/comb_script.jsl";
save_path = "$DOWNLOADS/";
separator = "//##";
txt = Load Text File(path);
lines = Words(txt, "\!N");
aa_scripts = Associative Array();
cur_filename = "";
For Each({line}, lines,
If(Starts With(line, separator), // new file
filename = Substitute(line, separator, "");
cur_filename = filename;
aa_scripts[cur_filename] = {};
,
Insert Into(aa_scripts[cur_filename], line);
);
);
For Each({{filename, script_lines}}, aa_scripts,
script_txt = Concat Items(script_lines, "\!N");
Save Text File(save_path || filename, script_txt);
);
Write();
Tenga en cuenta que esto eliminará los cambios de fila adicionales de sus datos debido al funcionamiento de Words. Si desea conservarlos, puede recorrer el texto en bucle usando "Contains" y "Substr" o algo similar.
Names Default To Here(1);
path = "$DOWNLOADS/comb_script.jsl";
save_path = "$DOWNLOADS/";
separator = "//##";
txt = Load Text File(path);
While(Length(txt) > 0,
separator_start = Contains(txt, separator);
separator_end = Contains(txt, separator, separator_start + 1);
If(separator_end == 0,
separator_end = Length(txt) + 1;
);
cur_script = Remove From(txt, 1, separator_end - separator_start);
cur_filename = Remove From(cur_script, 1, Contains(cur_script, "\!N") - 1);
cur_script = Trim Whitespace(cur_script);
filename = Substitute Into(cur_filename, separator, "");
Save Text File(save_path || cur_filename, cur_script);
);