通常在编程中,您会使用正则表达式在目录中搜索包含给定字符串的文件,然后使用成功或失败表达式。
然而,在 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 帮助,请尝试“运算符 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);