多文件導入、文件過濾大家好,
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 中設定名稱過濾器。感謝幫助