スクリプトファイルのコードをテキストファイルにコピーして読み取れるようにするスクリプトユーザーグループの皆さん!
スクリプトの作成方法について質問があります。1: 多数のスクリプトを含むフォルダをループ処理し、スクリプトファイル名をコピーし、そのファイル名の下のスクリプト自体をテキストファイルにコピーし、そのテキストファイルをフォルダ内のすべてのスクリプトと連結し続ける。2: テキストファイルからテキストを読み込み、指定したフォルダに新しいスクリプトファイルを作成する。ユーザーインターフェース側で処理内容(保存または読み込み)を選択し、フォルダを選択することは問題なく行えますが、ファイル名とスクリプトをテキストファイルに保存したり、読み込んだりする方法がわかりません。
たとえば、作成されるテキスト ファイルは次のようになります。
スクリプト1
名前のデフォルトは here(1) です。
dt1=現在のデータテーブル();
スクリプト2
名前のデフォルトは here(1) です。
dt2=現在のデータテーブル();
スクリプト3
名前のデフォルトは here(1) です。
dt3=現在のデータテーブル();
読み取られると、テキスト ファイル内のファイル名の下にあるコードがそれぞれ含まれる 3 つのスクリプト ファイルが出力されます。
ご提案があればいただければ幸いです。
自動化とスクリプトRe: スクリプトファイルのコードをテキストファイルにコピーして読み取れるようにするスクリプト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とファイル名をどのように区別していますか?ファイル名は非常に特殊なのでしょうか?
Re: スクリプトファイルのコードをテキストファイルにコピーして読み取れるようにするスクリプト@jthi さん、ありがとうございます。これはかなりうまくいきました!
ファイルの先頭をより明確な「//##」というテキストに変更したので、テキストファイルは次のようになります。
//##ラベルスクリプト.jsl
//改訂 5-9-25
名前のデフォルトは here(1) です。
dt=現在のデータテーブル();
選択された行=dt<
//##データテーブル.jsl の PDF を作成する
等......
これで、//## が新しいスクリプトファイルの開始を示し、ファイル名が //## と .jsl の間にあることがわかります。また、.jsl と次の //## の間にはスクリプトのテキストがあることもわかります。つまり、すべての識別子がそこにあるように見えます。JSL でこのようにコードを読み取ってこれらの識別子を利用してファイルを再構築する方法があるかどうか、それともその部分を別のプログラムで実行する必要があるかどうかが気になっています。
追加のご意見があれば、ぜひお知らせください。
Re: スクリプトファイルのコードをテキストファイルにコピーして読み取れるようにするスクリプトこれはテキスト解析とほとんど変わりませんし、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とデータテーブル.jslのPDFを作成する必要があります。私は次のようにします。</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);
);