嘿,用户组!
我有一个关于如何创建脚本的问题:1:循环遍历包含大量脚本的文件夹,复制脚本文件的名称,然后将脚本本身复制到名称下方的文本文件中,并不断将文本文件与文件夹中的所有脚本连接起来;2:能够从文本文件中读取文本,并在选定的文件夹中创建新的脚本文件。我可以创建用户界面来选择要执行的操作(保存或读入),并且可以毫无问题地选择文件夹,但我不确定如何将文件名和脚本保存到文本文件中或将其读入。
例如,它创建的文本文件将如下所示:
脚本一
名称默认为此处(1);
dt1=当前数据表();
脚本二
名称默认为此处(1);
dt2=当前数据表();
脚本 3
名称默认为此处(1);
dt3=当前数据表();
读取时会输出三个脚本文件,每个脚本文件都包含文本文件中文件名下的代码。
任何建议都将不胜感激。
像这样组合脚本而不是使用 Include 有什么特殊原因吗?
创建文本文件很简单,下面是一个例子
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"));
但创建脚本文件可能不那么容易。如何区分 JSL 和文件名?文件名有非常具体的吗?
谢谢@jthi ,效果很好!
我将文件的开头改为更清晰的文本“//##”,因此现在文本文件看起来像这样
//##标签 script.jsl
//修订版 5-9-25
名称默认为此处(1);
dt=当前数据表();
选定的行=dt<
//##制作数据表的PDF.jsl
ETC......
所以现在我知道了 //## 表示一个新脚本文件的开始,并且文件名位于 //## 和 .jsl 之间。我还知道 .jsl 和下一个 //## 之间是脚本的文本。所以看起来所有标识符都在那里,我只是想知道在 JSL 中是否有一种方法可以读取代码,并利用这些标识符来重建文件,或者我是否必须在其他程序中完成这部分工作。
感谢您的补充想法!
这和文本解析没什么区别,用 JSL 很容易就能搞定。假设我们合并了如下文件
//##label script.jsl
//rev 5-9-25
names default to here(1);
dt=current datatable();
selected_rows=dt<
<GET selected="" rows=""></GET>
<P>它应该分成标签 script.jsl 和制作数据表的 PDF.jsl,我会做这样的事情</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();
请注意,由于 Words 的工作方式,这将从数据中删除额外的行更改。如果您希望保留这些更改,可以使用 Contains 和 Substr 或类似方法循环遍历文本。
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);
);