In genere nella programmazione si utilizzano espressioni regolari per cercare file in una directory che contengono una determinata stringa, per poi utilizzare un'espressione di successo o fallimento.
Tuttavia, in JMP, l'ordinamento avanzato non sembra essere possibile utilizzando solo i file nella directory.
Pertanto, sto pensando a un processo in cui posso memorizzare i dati in una variabile, quindi aggiungere condizioni e estrarne i dati. Quali tecniche useresti?
Se possibile, vorrei ordinare i file utilizzando più espressioni regolari.
JMP in uso: JMP18.2.1
Filter Each() è la soluzione. Esempio per trovare i file .png che contengono "2024-06"
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" ) );
Mi chiamo Ono e sono un tester senior presso la divisione JMP Japan del SAS Institute Japan.
A questa domanda è già stata data risposta, ma per sicurezza farò un semplice esempio.
Di seguito, Regex e Filter Each vengono utilizzati per estrarre le stringhe che iniziano con "E" (^E), contengono numeri a mezza larghezza ([0-9]) e terminano con ".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$" )));
Lo stesso processo può essere eseguito utilizzando funzioni che iniziano con Pat anziché Regex, ma le specifiche potrebbero essere un po' più lunghe.
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));
);
Anche il valore restituito da Filter Each è un elenco, quindi da lì è possibile restringere ulteriormente il campo.
Di seguito restringiamo ulteriormente i risultati a quelli che contengono la stringa "001.txt" nel nome del file.
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"));
Grazie a tutti per le vostre risposte ponderate.
Sebbene la manipolazione delle variabili sia molto importante, ho avuto difficoltà a capirlo e, dopo molti tentativi ed errori, sono arrivato al codice seguente.
1. Leggi il percorso di una cartella qualsiasi e crea prima un elenco di file
2. Restringi solo al formato CSV
3. Utilizzare espressioni regolari per filtrare i file che non contengono un carattere specifico
C'è una cosa che ancora non capisco: la scritta "Manca!" che precede la scritta. A cosa serve?
//以下のフォルダにあるファイル一覧を変数に取得する。
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);
Sono felice che siamo riusciti a realizzare ciò che volevi.
Un punto esclamativo "!" da solo è l'"operatore logico Not" che nega l'espressione che lo segue. In JMP, l'"operatore logico Not" inverte i valori 1 e 0. (Più precisamente, in JMP, restituisce 1 per 0 e 0 per qualsiasi valore diverso da zero, incluso 1).
Ciò è descritto nel seguente manuale.
(È possibile trovare risultati cercando "JMP Operators Help" nella ricerca Google oppure "Operator Not" nella Guida di JMP.)
È anche possibile cercare "Not" nel menu a discesa JMP in Aiuto > Indice scripting per trovare risultati (come descritto di seguito, l'operatore "!" ha una funzione alias chiamata Not).
Ad esempio, il seguente inverte 1 e restituisce 0:
Poi invertiamo lo 0 e rimettiamo 1.
Se l'operatore logico "!" risulta difficile da comprendere, esiste una funzione equivalente (una funzione alias) chiamata funzione Not.
Show(Not(1)); // 「!1」と同じ
Show(Not(0)); // 「!0」と同じ
La funzione Is Missing restituisce 1 quando l'argomento è un valore mancante e 0 quando l'argomento è un valore non mancante. In questo caso, vogliamo i valori invertiti di 0 e 1, quindi utilizziamo l'operatore logico Not "!".
Nel seguente esempio, l'argomento è un valore mancante, quindi Is Missing restituisce 0, ma l'operatore logico Not "!" lo inverte in 1.
Nel seguente esempio, Is Missing restituisce 1 perché l'argomento è un valore non mancante, ma il simbolo "!" lo inverte in 0.
Show(!Is Missing("Hello, World!"));
■Digressione 1
Si noti che sia la funzione Is Missing sia l'operatore logico Not ("!") possono accettare matrici ed elenchi come argomenti, proprio come molte altre funzioni e operatori.
x = [15.3, 12.1, ., 13.2, 14.1, .];
Show(!Is Missing(x));
y = {"りんご", "バナナ", "", "みかん"};
Show(!Is Missing(y));
■Digressione 2
Se !Is Missing(x) è poco chiaro, puoi anche scrivere Is Missing(x)==0 o Is Missing(x)!=1. (Il punto esclamativo seguito dal segno di uguale, "!=", restituisce 1 se il lato destro non è uguale al lato sinistro e 0 se sono uguali.)
Show(Is Missing("")==0);
Show(Is Missing("")!=1);
Show(Is Missing("Hello, World!")==0);
Show(Is Missing("Hello, World!")!=1);
■Motivo per cui questa volta si usa "!"
Il filtro Ogni funzione estrae solo gli elementi per i quali il valore di valutazione del terzo argomento è vero (1).
Ad esempio, il seguente comando estrae solo gli elementi di un elenco x che sono maggiori di 2:
x = {1,5,2,4,3,2,1,4,5,9,1};
y = Filter Each({v,i},x, v > 2);
Show(y);
Se si vogliono estrarre elementi in cui v>2 è l'opposto, basta specificare v <= 2, ma è possibile anche specificare !(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) restituisce "1" se v non è maggiore di 2 (ovvero, v è minore o uguale a 2) e "0" in caso contrario.
■Note aggiuntive
Non ho molta familiarità con le espressioni regolari, quindi l'elaborazione potrebbe non essere necessariamente equivalente e il codice potrebbe essere più difficile da leggere, ma è possibile combinare le espressioni regolari in una sola come mostrato di seguito? (Mi scuso se sbaglio sull'elaborazione che vuoi fare.)
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);