嘿,用戶群組!
我有一個關於如何創建腳本的問題: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);
);