En programmation, vous utilisez généralement des expressions régulières pour rechercher des fichiers dans un répertoire contenant une chaîne donnée, puis vous utilisez une expression de réussite ou d'échec.
Cependant, dans JMP, le tri avancé ne semble pas possible en utilisant uniquement les fichiers du répertoire.
Je réfléchis donc à un processus permettant de stocker les données dans une variable, puis d'y ajouter des conditions et de les extraire. Quelles techniques utiliseriez-vous ?
Si possible, j'aimerais trier les fichiers à l'aide de plusieurs expressions régulières.
JMP en cours d'utilisation : JMP18.2.1
Filtrer chaque() est la méthode la plus efficace. Exemple pour trouver les fichiers .png contenant « 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" ) );
Je m'appelle Ono et je suis testeur senior à la division JMP Japon du SAS Institute Japan.
Cette question a déjà été répondue, mais je vais donner un exemple simple juste pour être sûr.
Ci-dessous, Regex et Filter Each sont utilisés pour extraire les chaînes qui commencent par « E » (^E), contiennent des nombres demi-largeur ([0-9]) et se terminent par « .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$" )));
Le même processus peut être effectué en utilisant des fonctions commençant par Pat au lieu de Regex, mais la spécification peut devenir un peu plus longue.
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));
);
La valeur de retour de Filter Each est également une liste, vous pouvez donc la restreindre davantage à partir de là.
Ci-dessous, nous affinons davantage les résultats à ceux qui contiennent la chaîne « 001.txt » dans le nom de fichier.
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"));
Merci à tous pour vos réponses réfléchies.
Bien que la manipulation des variables soit très importante, j'ai eu du mal à la comprendre, et après de nombreux essais et erreurs, j'ai fini par obtenir le code ci-dessous.
1. Lisez le chemin d'accès de n'importe quel dossier et créez d'abord une liste de fichiers
2. Limitez votre recherche au format CSV uniquement
3. Utilisez des expressions régulières pour filtrer les fichiers qui ne contiennent pas un caractère spécifique
Il y a une chose que je ne comprends toujours pas : le « Manquant ! » qui précède. À quoi sert-il ?
//以下のフォルダにあるファイル一覧を変数に取得する。
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);
Je suis heureux que nous ayons pu accomplir ce que vous vouliez.
Le point d'exclamation « ! » seul est l'« opérateur non logique » qui inverse l'expression qui le suit. Dans JMP, l'« opérateur non logique » inverse 1 et 0. (Plus précisément, dans JMP, il renvoie 1 pour 0 et 0 pour toute valeur non nulle, y compris 1).
Ceci est décrit dans le manuel suivant.
(Vous pouvez trouver des résultats en recherchant « Aide des opérateurs JMP » dans la recherche Google ou « Opérateur non » dans l'aide JMP.)
Vous pouvez également rechercher « Not » dans le menu déroulant JMP sous Aide > Index de script pour trouver des résultats (comme décrit ci-dessous, l'opérateur « ! » a une fonction d'alias appelée Not).
Par exemple, ce qui suit inverse un 1 et renvoie un 0 :
Ensuite, nous inversons le 0 et remettons 1.
Si l'opérateur logique « ! » est difficile à comprendre, il existe une fonction équivalente (une fonction alias) appelée fonction Not.
Show(Not(1)); // 「!1」と同じ
Show(Not(0)); // 「!0」と同じ
La fonction « Manquant » renvoie 1 lorsque l'argument est manquant et 0 lorsqu'il est non manquant. Dans cet exemple, nous souhaitons obtenir les valeurs inversées de 0 et 1 ; nous utilisons donc l'opérateur logique « Non ! ».
Dans ce qui suit, l'argument est une valeur manquante, donc Is Missing renvoie 0, mais l'opérateur logique Not "!" inverse cela en 1.
Dans ce qui suit, Is Missing renvoie 1 car l'argument est une valeur non manquante, mais le « ! » l'inverse en 0.
Show(!Is Missing("Hello, World!"));
■Digression 1
Notez que la fonction Is Missing et l'opérateur logique Not ("!") peuvent prendre des matrices et des listes comme arguments, tout comme de nombreuses autres fonctions et opérateurs.
x = [15.3, 12.1, ., 13.2, 14.1, .];
Show(!Is Missing(x));
y = {"りんご", "バナナ", "", "みかん"};
Show(!Is Missing(y));
■ Note latérale 2
Si !Is Missing(x) prête à confusion, vous pouvez également écrire Is Missing(x)==0 ou Is Missing(x)!=1. (Le point d'exclamation suivi d'un signe égal, « != », renvoie 1 si le membre de droite n'est pas égal au membre de gauche, et 0 s'ils sont égaux.)
Show(Is Missing("")==0);
Show(Is Missing("")!=1);
Show(Is Missing("Hello, World!")==0);
Show(Is Missing("Hello, World!")!=1);
■Raison d'utiliser « ! » cette fois
Le filtre Chaque fonction extrait uniquement les éléments pour lesquels la valeur d'évaluation du troisième argument est vraie (1).
Par exemple, ce qui suit extrait uniquement les éléments d’une liste x qui sont supérieurs à 2 :
x = {1,5,2,4,3,2,1,4,5,9,1};
y = Filter Each({v,i},x, v > 2);
Show(y);
Si vous souhaitez extraire des éléments où v>2 est l'opposé, vous spécifiez simplement v <= 2, mais vous pouvez également spécifier !(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) renvoie « 1 » si v n'est pas supérieur à 2 (c'est-à-dire que v est inférieur ou égal à 2), et « 0 » sinon.
■Remarques supplémentaires
Je ne suis pas très familier avec les expressions régulières, donc le traitement n'est peut-être pas forcément équivalent et le code peut être plus difficile à lire. Mais est-il possible de combiner les expressions régulières en une seule, comme illustré ci-dessous ? (Je suis désolé si je me trompe sur le traitement que vous souhaitez effectuer.)
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);