통상, 프로그래밍에서는 정규 표현등으로, 디렉토리안의 임의의 캐릭터 라인을 포함한 파일등을 성부 표현으로 준다고 생각합니다.
그러나 JMP에서는 Files In Directory 단독으로는 고급 정렬을 할 수 없는 것 같습니다.
그러므로, 한번 변수에 격납한 것에 조건을 추가하면서, 깎아내는 것 같은 처리를 생각하고 있습니다만, 어떠한 수법이 있습니까?
가능하다면 여러 번 정규식을 사용하여 파일을 정렬하고 싶습니다.
사용중인 JMP : JMP18.2.1
Filter Each()를 사용하는 것이 가장 좋습니다. "2024-06"이 포함된 .png 파일을 찾는 예시입니다.
Names Default To Here( 1 );
files = Files In Directory( Pick Directory( "" ) );
filtered_files = Filter Each( {v, i}, files, Contains( v, "2024-06" ) & Ends With( v, ".png" ) );
Each()를 필터링하고, 정규식을 사용하려면 Is Missing()과 결합할 수 있습니다.
SAS Institute Japan 주식회사 JMP 재팬 사업부 시니어 테스터의 오노라고 합니다.
이미 대답이 나와 있습니다만, 만약을 위해서 간단한 구체예를 나타냅니다.
아래에서는 Regex 및 Filter Each를 사용하여 선두가 "E"로 시작하고 (^E), 반각 숫자를 포함하고([0-9]), 마지막 문자열이 ".txt"인 것(\.txt$)을 꺼냅니다.
files = {"E001.txt", "B002.txt", "EEEEE.txt", "E001.jpg", "E001.txt.jpg", "C001.txt", "EAB1.txt", "1111.txt"};
filtered_files = Filter Each( {v, i}, files, !Is Missing(Regex(v, "^E(.*)[0-9](.*)\.txt$" )));
비슷한 처리는 Regex 대신 Pat으로 시작하는 함수에서도 가능하지만 약간 지정이 길어질 수 있습니다.
files = {"E001.txt", "B002.txt", "EEEEE.txt", "E001.jpg", "E001.txt.jpg", "C001.txt", "EAB1.txt", "1111.txt"};
filtered_files = Filter Each( {v, i}, files,
Pat Match(v, Pat Pos(0) + "E" + Pat Arb() + Pat Regex("[0-9]") + Pat Arb() + ".txt" + Pat R Pos(0));
);
Filter Each의 반환값도 리스트이므로 거기에서 더 좁힐 수도 있습니다.
아래에서는 파일 이름에 "001.txt"라는 문자열을 포함하는 것을 더 좁혀줍니다.
files = {"E001.txt", "B002.txt", "EEEEE.txt", "E001.jpg", "E001.txt.jpg", "C001.txt", "EAB1.txt", "1111.txt"};
filtered_files = Filter Each( {v, i}, files, !Is Missing(Regex(v, "^E(.*)[0-9](.*)\.txt$" )));
final_list = Filter Each({v,i}, filtered_files, Contains(v,"001.txt"));
여러분, 정중하게 회신 해 주셔서 감사합니다.
변수에 대한 조작은 매우 중요합니다만, 좀처럼 이해할 수 없고 시행착오한 결과 이하와 같은 코드로 완성되었습니다.
1, 임의의 폴더의 패스를 읽어들여, 파일의 일람을 우선은 만든다
2, CSV에만 좁히기
3, 정규 표현식을 사용하여 임의의 문자를 "포함하지 않는"파일로 필터링
단지 1점, 아직 Is Missing의 앞에 있다!의 의미를 이해할 수 없어요.
//以下のフォルダにあるファイル一覧を変数に取得する。
files = Files In Directory( "%USERPROFILE%document" );
//絞り込み_CSVファイルである
filtered_files = Filter Each( {v, i}, files, !Is Missing(Regex(v, "^(.*)[0-9](.*)\.csv$" )));
//with_key_とspec_から始まるファイルを除外する;
list = Filter Each( {v, i}, filtered_files, !Is Missing(Regex(v, "^(?!.*with_key_|spec_).*$")));
show(list);
어떻게 든 원하는 처리를 할 수 있어서 좋았습니다.
익스클라메이션 마크(놀라운 마크, 느낌표) 「!」단체는, 후속의 식의 부정을 나타내는 「Not 논리 연산자」가 되어 있습니다.
다음 설명서에 설명이 있습니다.
(Google 검색하는 경우에는 「JMP 연산자 도움말」, JMP 도움말에서 검색하는 경우에는 「연산자 Not」을 키워드로 하면 히트할지도 모릅니다.)
또한 JMP의 풀다운 메뉴에서 [도움말] → [스크립트 색인]에서 "Not"으로 검색하면 히트합니다 (아래에 설명하는 것처럼 "!"연산자는 별명 함수로 Not 함수를 제공합니다).
예를 들어, 다음은 1을 반전시켜 0을 리턴합니다.
다음은 0을 반전시켜 1을 반환합니다.
이 논리 연산자 「!」가 알기 어려운 경우에는, 동등한 함수로서 (별명의 함수로서) Not 함수가 있습니다.
Show(Not(1)); // 「!1」と同じ
Show(Not(0)); // 「!0」と同じ
Is Missing 함수는 인수가 결측값일 때 1을, 인수가 비결측값일 때 0을 반환하는 함수입니다.
다음은 인수가 결측값이므로 Is Missing은 0을 반환하지만 Not 논리 연산자 "!"에 의해 반전되어 1이 됩니다.
다음은 인수가 비결측값이므로 Is MIssing은 1을 반환하지만 "!"에 의해 반전된 0이 됩니다.
Show(!Is Missing("Hello, World!"));
■여담1
Is Missing 함수와 Not 논리 연산자("!") 모두 다른 많은 함수나 연산자와 마찬가지로 행렬이나 리스트를 인수로 취할 수도 있습니다.
x = [15.3, 12.1, ., 13.2, 14.1, .];
Show(!Is Missing(x));
y = {"りんご", "バナナ", "", "みかん"};
Show(!Is Missing(y));
■여담 2
!Is Missing(x)가 알기 어려운 경우에는 Is Missing(x)==0 이나 Is Missing(x)!=1 로 지정할 수도 있습니다.
Show(Is Missing("")==0);
Show(Is Missing("")!=1);
Show(Is Missing("Hello, World!")==0);
Show(Is Missing("Hello, World!")!=1);
■이번, 「!」를 이용한 이유
Filter Each 함수는, 제3 인수의 평가치가 참(1)이 되는 요소만을 추출합니다.
예를 들어, 다음은 목록 x 중 2보다 큰 요소만 추출합니다.
x = {1,5,2,4,3,2,1,4,5,9,1};
y = Filter Each({v,i},x, v > 2);
Show(y);
v>2와 반대의 요소를 빼내는 경우에는, v <= 2라고 지정하면 됩니다만,!(v >2)라고 지정할 수도 있습니다.
x = {1,5,2,4,3,2,1,4,5,9,1};
y = Filter Each({v,i},x, !(v > 2));
Show(y);
!(v > 2)는 v가 2보다 크지 않은 경우(즉, v가 2 이하인 경우)에 '1'을, 그렇지 않으면 '0'을 리턴합니다.
■부기
나 자신이 정규 표현에 희미하기 때문에 반드시 동등한 처리는 되지 않을지도 모릅니다만, 또, 어쨌든 코드를 읽기 어려워질지도 모릅니다만, 정칙 표현을 이하와 같이 1개에 정리할 수 없습니까? (하고 싶은 처리를 잘못하면 죄송합니다.)
files = {
"with_key_001.csv", "spec_001.csv",
"aaa_with_key_001.csv", "aaa_spec_001.csv",
"with_key_001bbb.csv", "spec_001bbb.csv",
"aaa_with_key_001bbb.csv", "aaa_spec_001bbb.csv",
"001.csv", "aaa001.csv", "001bbb.csv", "aaa001bbb.csv",<BR />"001.txt", "aaa001.txt", "001bbb.txt", "aaa001bbb.txt",<BR />"aaa001bbb.csv.txt"
};
list = Filter Each( {v, i}, files, !Is Missing(Regex(v, "^(?!.*with_key_|spec_)(.*)[0-9](.*)\.csv$" )));
show(list);