스크립트 파일 코드를 텍스트 파일에 복사한 다음 읽을 수 있는 스크립트안녕하세요, 사용자 그룹 여러분!
스크립트를 만드는 방법에 대한 질문이 있습니다. 1. 스크립트가 여러 개 있는 폴더를 순회하며 스크립트 파일 이름을 복사한 다음, 스크립트 자체를 이름 아래에 있는 텍스트 파일로 복사하고, 해당 텍스트 파일을 폴더의 모든 스크립트와 연결하는 스크립트를 만듭니다. 2. 텍스트 파일에서 텍스트를 읽어서 선택한 폴더에 새 스크립트 파일을 만들 수 있어야 합니다. 사용자 인터페이스 측면에서 어떤 작업을 할지(저장할지 읽을지) 선택하고 폴더를 선택하는 것은 어렵지 않지만, 파일 이름과 스크립트를 텍스트 파일에 저장하거나 읽는 방법은 잘 모르겠습니다.
예를 들어 생성된 텍스트 파일은 다음과 같습니다.
스크립트 1
이름은 기본적으로 여기(1)에 저장됩니다.
dt1=현재 데이터 테이블();
대본 2
이름은 기본적으로 여기(1)에 저장됩니다.
dt2=현재 데이터 테이블();
대본 3
이름은 기본적으로 여기(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
//2025년 9월 5일 개정
이름은 기본적으로 여기(1)에 있습니다.
dt=현재 데이터 테이블();
선택된 행=dt<
//##데이터 테이블의 PDF 만들기.jsl
등......
이제 //##가 새 스크립트 파일의 시작을 알리고, 파일 이름이 //##와 .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>그리고 이것을 label script.jsl과 Make a PDF of a data table.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);
);