多文件导入、文件过滤大家好,
JSL新手来了! 我需要导入多个文件,其中导入的文件名有一些需要满足的参数。
- 不能包含某些字符。这些字符始终位于文件名的末尾。
- 必须包含特定字符串
- 如果找到的文件名中存在相同的字符串段,则仅导入具有最新系统日期和时间戳的字符串段。 我需要一种方法来分割和比较文件名的各个部分。
例如:我想要所有含有“苹果”的水果冰沙饮料,但不含有“番茄”。 (文件名、日期和时间 YYYYMMDD HHMM)
猕猴桃_苹果_芒果.csv 20220125 1421
苹果_葡萄_猕猴桃.csv 20220125 1243
Durien_Tomato.csv 20220126 1607
苹果_葡萄_猕猴桃_番茄.csv 20220126 1537
芒果_香蕉_Durien.csv 20220126 0915
葡萄_菠萝_苹果_鳄梨.csv 20220126 0711
苹果_葡萄_猕猴桃.csv 20220127 1111
文件的命名确实有结构。我正在寻找的字符串位于多个分隔符之后。
额外询问
- 是否有任何提示可以加快在存储数千个文件的文件夹中搜索这些文件的速度?我只能在初始搜索后按扩展名进行过滤。 目前,搜索并找到该文件夹中的所有文件都需要花费几分钟的时间。
- 对于导入越来越多的文件有什么建议吗? 几个月后,导入的文件数量可能会突破 1000 个。它们都具有相同的数据结构。我知道我需要“堆叠类似文件”。这些都是数据表。
我查找了 Words 和 Munger 函数,但我不确定它们是完成文件导入脚本所需的函数。
数据存取视窗回复:多个文件导入、文件过滤谢谢你!Pat Regex 的 Contains Item 似乎可以解决问题!
回复:多个文件导入、文件过滤是的,但很难说哪一种最适合您。
您也许可以使用 contains(),并完全忽略 _ 分隔符。 不知道代币有没有菠萝和苹果是否存在问题,但它们可能存在,因为其中一个包含另一个。 葡萄和柚子也。 也许大写/小写可以解决它?
您可能想了解正则表达式。 (我用了正则表达式.info .) 该函数返回字符匹配,或数字缺失值
regex("applepearorange","carrot|pear")
您可以将它与 isstring(...) 或 ismissing(...) 一起使用以获得正确/错误的答案。 | 的 |正则表达式中是替代方案。
您还可以将正则表达式与 contains_item() 一起使用。 除了这个快速测试之外,我从未使用过它,这是我发现向其传递模式的唯一方法:
Contains Item( "apple_grapefruit_lime", Pat Regex( "carrot|grape" ), "_" )
这意味着将输入拆分为 _ 并使用正则表达式测试每个段。
回复:多个文件导入、文件过滤我现在修改了我的代码,如下所示,它可以工作,但不是最佳的。 “abc”并不总是单独存在并分隔在分隔符“_”之间。例如,有时我可能有“_xyzabc_”或“_abcxyz_”。 是否有一个函数可以遍历整个字符串来找到这组字符?该字符串始终位于字符串中的某个位置。
files_list = Files In Directory( "C:\Data\" );
dt = Current Data Table();
For( i = 1, i <= N Rows( dt ), i++,
if( Contains Item(:Column 1[i], "abc", "_") == 1,
dt <<DELETE row=""></DELETE>
回复:多个文件导入、文件过滤我意识到部分问题出在我的 if 语句的条件上,所以我修改了下面的代码。它总是继续,除非我编辑代码来搜索整个的开始子字符串。 我要搜索的是字符串内的内容,如果我向后或向前搜索,则仅测试字符串的开头或结尾不是我要寻找的。
files_list = Files In Directory( "C:\Data\" );
dt = Current Data Table();
For( i = 1, i <= N Rows( dt ), i++,
if( contains(:Column 1[i], "abc") == 1,
dt <<DELETE row=""></DELETE>
回复:多个文件导入、文件过滤您好,我已使用 Files In Directory() 成功填充了文件名列表。我已经研究了 Filter Each(),但我无法添加所需数量的条件,因此我希望链接一些嵌套在 For 循环中的条件 If 语句。 在后台,我有每个文件名的 dt,每一行一个,全部在一列中。
基本上,我想使用 !contains() 或 contains() 检查每个元素并相应地删除或保留该行。是的,我知道这会导致“ i ”计数器出现问题。计数器很容易调整。 不过还是一步一脚印。 当我运行这个脚本时,没有弹出错误,也没有任何反应。我检查了调试器,但无法找到 contains() 的任何类型的计数器,所以我有点困惑为什么这不起作用。有什么见解吗?
files_list = Files In Directory( "C:\Data\" );
dt = Current Data Table();
For( i = 1, i <= N Rows( dt ), i++,
if( :Column 1[i] == contains(:Column 1[i], "abc"),
dt <<DELETE row=""></DELETE>
回复:多个文件导入、文件过滤只是想说我会回到这个话题。 目前我的注意力需要转移到工作的其他地方。 我没有忘记。
回复:多个文件导入、文件过滤(已解除隔离,抱歉,希望我选对了,但不清楚为何被标记。)
contains() 是一个可以在从 FilesInDirectory(...) 返回的文件列表上逐个元素使用的函数。
您可以将文件名传递给过滤器,如下所示:
??苹果*梨*.csv
每个 ?匹配 1,每个 * 匹配 0 个或多个。w9apple_fig_pear_grape.csv 将匹配。
你可能会使用这样的东西
list = files in directory("$desktop",recursive(1));
list = filtereach({name},list,contains(name,".txt"));
namefilterdata = concatitems(list,";");
创建要传递给 MFI 名称过滤器的值。
MFI 括号中的 <回复:多个文件导入、文件过滤
当我添加 !Contains(part, "Tomato") 或 Contains(part, "Apple") 时,脚本陷入循环发现我正在搜索的文件夹中的文件。 数据导入实际上从未发生。 对于为什么会发生这种情况有什么想法吗?
我将代码复制到此处,但由于某种原因它不断被报告为垃圾邮件
回复:多个文件导入、文件过滤你好,
一旦我将 Contains 添加到脚本中,它就会继续循环查找文件夹中的文件,并且从不导入数据。 有小费吗?
Multiple File Import(
<<SET folder=""></SET>
回复:多个文件导入、文件过滤谢谢您的回复,jthi!我将能够在下周初测试这一点并回复您。
多文件导入、文件过滤首先我会得到一个文件列表。 在 JMP 中执行此操作的方法有很多,具体使用哪种方法取决于您的速度要求(以及可能的数据要求)。要获取可以使用的文件列表,可以使用操作系统命令(例如,在 Windows 命令行中为 dir ,在 powershell 中为获取子项目 (docs.microsoft.com)要获取文件列表或直接使用 JMP,您可以使用 Files In Directory() 或 Multiple File Import()(请参阅目录树:探索文件夹使用的空间以小额信贷机构为例)。
在列表或 JMP 数据表中获得文件列表后,您可以开始使用某种算法对其进行过滤。 以下是一些想法:
- 使用 Ends With() 检查字符串结尾
- 使用 Contains() 检查特定字符串,并使用 !Contains() 排除其他字符串
- 对于相同的片段(是否只是一个常见单词、单词组合、特定顺序的单词......)Words() 和 Associative Arrays() 在这里很可能有帮助
- 有关更多想法,请参阅字符函数的脚本索引部分
在不知道如何使用数据表的情况下,除了加载初始文件列表的可选方法之外,就其他问题提供良好的提示有点困难。 一种选择是创建包含一些计划任务的数据表,以便用户在需要时可以使用它。
回复:多个文件导入、文件过滤你好,我不知道如果我想在 MFI 期间排除任何带有 tomato 的文件名,该怎么办。如何在 MFI 中设置名称过滤器。感谢帮助