通常在程式設計中,您會使用正規表示式在目錄中搜尋包含給定字串的文件,然後使用成功或失敗表達式。
然而,在 JMP 中,僅使用目錄中的檔案似乎無法進行進階排序。
因此,我正在考慮一個流程:先將資料儲存在一個變數中,然後新增條件並抓取資料。你會使用哪些技巧?
如果可能的話,我想使用多個正規表示式對檔案進行排序。
正在使用的 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提取以「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$" )));
可以使用以 Pat 開頭的函數而不是 Regex 來執行相同的過程,但規範可能會變得更長一些。
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));
);
FilterEach 的傳回值也是一個列表,因此您可以從那裡進一步縮小範圍。
下面,我們進一步將結果範圍縮小到檔案名稱中包含字串「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.使用正規表示式過濾不包含特定字元的文件
有一件事我還是不懂:它前面的「失蹤了!」到底有什麼用?
//以下のフォルダにあるファイル一覧を変数に取得する。
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);
我很高興我們能夠完成你想要做的事。
感嘆號“!”本身是“非邏輯運算符”,用於對其後的表達式取反。在 JMP 中,「非邏輯運算子」用於將 1 和 0 取反。 (更準確地說,在 JMP 中,它對 0 返回 1,對任何非零值(包括 1)返回 0。)
以下手冊中對此進行了描述。
(您可以在 Google 搜尋中搜尋“JMP 運算子幫助”,或在 JMP 幫助中搜尋“Operator Not”以找到結果。)
您也可以在說明 > 腳本索引下的 JMP 下拉選單中搜尋「Not」來尋找結果(如下所述,「!」運算子有一個名為 Not 的別名函數)。
例如,以下將 1 反轉並傳回 0:
接下來,我們將 0 反轉並將 1 放回原位。
如果邏輯運算子「!」難以理解,那麼有一個等效函數(也稱為Not函數)。
Show(Not(1)); // 「!1」と同じ
Show(Not(0)); // 「!0」と同じ
當參數為缺失值時,Is Missing 函數傳回 1,當參數為非缺失值時,傳回 0。在本例中,我們想要 0 和 1 的反轉值,因此使用 Not 邏輯運算子「!」。
在下文中,參數是缺失值,因此 Is Missing 傳回 0,但非邏輯運算子「!」將其反轉為 1。
在下文中,Is Missing 傳回 1,因為參數是非缺失值,但「!」將其反轉為 0。
Show(!Is Missing("Hello, World!"));
■題外話1
請注意,Is Missing 函數和非邏輯運算子(「!」)都可以將矩陣和列表作為參數,就像許多其他函數和運算子一樣。
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。 (感嘆號後面跟著等號“!=”表示如果右側不等於左側,則返回 1;如果左側等於,則返回 0。)
Show(Is Missing("")==0);
Show(Is Missing("")!=1);
Show(Is Missing("Hello, World!")==0);
Show(Is Missing("Hello, World!")!=1);
■這次使用「!」的理由
Filter Each 函數只擷取第三個參數的評估值為真 (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”。
■補充說明
我對正規表示式不是很熟悉,所以處理可能不一定是等效的,程式碼可能更難閱讀,但是是否可以將正規表示式組合成一個,如下所示? (如果我對您想要做的處理有誤,我很抱歉。)
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);