Normalmente, en programación, se utilizan expresiones regulares para buscar archivos en un directorio que contengan una cadena determinada y luego se utiliza una expresión de éxito o fracaso.
Sin embargo, en JMP, la clasificación avanzada no parece ser posible utilizando únicamente archivos en el directorio.
Por lo tanto, estoy pensando en un proceso que me permita almacenar los datos en una variable, luego añadirles condiciones y extraerlos. ¿Qué técnicas utilizarías?
Si es posible, me gustaría ordenar los archivos utilizando múltiples expresiones regulares.
JMP en uso: JMP18.2.1
Filtrar cada() es la solución. Ejemplo para encontrar archivos .png que contengan "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 nombre es Ono y soy probador senior en la división JMP Japón de SAS Institute Japan.
Esto ya ha sido respondido, pero daré un ejemplo sencillo para estar seguro.
A continuación, se utilizan Regex y Filter Each para extraer cadenas que comienzan con "E" (^E), contienen números de medio ancho ([0-9]) y terminan 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$" )));
Se puede realizar el mismo proceso utilizando funciones que comiencen con Pat en lugar de Regex, pero la especificación puede resultar un poco más larga.
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));
);
El valor de retorno de Filter Each también es una lista, por lo que puedes limitarlo aún más desde allí.
A continuación, restringimos aún más los resultados a aquellos que contienen la cadena "001.txt" en el nombre del archivo.
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"));
Gracias a todos por sus atentas respuestas.
Aunque manipular variables es muy importante, me costó entenderlo y después de mucho ensayo y error terminé con el código a continuación.
1. Lea la ruta de cualquier carpeta y cree una lista de archivos primero
2. Limitar solo a CSV
3. Utilice expresiones regulares para filtrar archivos que no contengan un carácter específico
Hay algo que todavía no entiendo: el "¡Falta!" que aparece delante. ¿Para qué sirve?
//以下のフォルダにあるファイル一覧を変数に取得する。
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);
Me alegro de que hayamos podido lograr lo que querías.
Un signo de exclamación "!" por sí solo es un operador no lógico que niega la expresión que le sigue. En JMP, este operador invierte los valores 1 y 0. (Más precisamente, en JMP, devuelve 1 para 0 y 0 para cualquier valor distinto de cero, incluido 1).
Esto se describe en el siguiente manual.
(Puede encontrar resultados buscando "Ayuda de operadores JMP" en la búsqueda de Google, o "Operador no" en la Ayuda de JMP).
También puede buscar "Not" en el menú desplegable de JMP, en Ayuda > Índice de scripts, para encontrar resultados. (Como se describe a continuación, el operador "!" tiene una función alias llamada Not).
Por ejemplo, lo siguiente invierte un 1 y devuelve un 0:
A continuación, invertimos el 0 y ponemos nuevamente el 1.
Si el operador lógico "!" es difícil de entender, existe una función equivalente (una función alias) llamada función Not.
Show(Not(1)); // 「!1」と同じ
Show(Not(0)); // 「!0」と同じ
La función "Falta" devuelve 1 si el argumento es un valor faltante y 0 si no lo es. En este caso, necesitamos los valores invertidos de 0 y 1, por lo que usamos el operador "No lógico" "!".
A continuación, el argumento es un valor faltante, por lo que Is Missing devuelve 0, pero el operador No lógico "!" lo invierte a 1.
A continuación, Is Missing devuelve 1 porque el argumento es un valor no faltante, pero el "!" lo invierte a 0.
Show(!Is Missing("Hello, World!"));
■Digresión 1
Tenga en cuenta que tanto la función Is Missing como el operador No lógico ("!") pueden tomar matrices y listas como argumentos, al igual que muchas otras funciones y operadores.
x = [15.3, 12.1, ., 13.2, 14.1, .];
Show(!Is Missing(x));
y = {"りんご", "バナナ", "", "みかん"};
Show(!Is Missing(y));
■Digresión 2
Si !Is Missing(x) resulta confuso, también puede escribir Is Missing(x)==0 o Is Missing(x)!=1. (El signo de exclamación seguido de un signo igual, "!=", devuelve 1 si el lado derecho no es igual al izquierdo y 0 si son iguales).
Show(Is Missing("")==0);
Show(Is Missing("")!=1);
Show(Is Missing("Hello, World!")==0);
Show(Is Missing("Hello, World!")!=1);
■Razón para usar "!" esta vez
El filtro Cada función extrae sólo los elementos para los cuales el valor de evaluación del tercer argumento es verdadero (1).
Por ejemplo, lo siguiente extrae solo aquellos elementos de una lista x que sean mayores que 2:
x = {1,5,2,4,3,2,1,4,5,9,1};
y = Filter Each({v,i},x, v > 2);
Show(y);
Si desea extraer elementos donde v > 2 es lo opuesto, simplemente especifique v <= 2, pero también puede especificar !(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) devuelve "1" si v no es mayor que 2 (es decir, v es menor o igual a 2) y "0" en caso contrario.
■Notas adicionales
No estoy muy familiarizado con las expresiones regulares, por lo que el procesamiento puede no ser necesariamente equivalente y el código podría ser más difícil de leer, pero ¿es posible combinar las expresiones regulares en una sola como se muestra a continuación? (Disculpe si me equivoco sobre el procesamiento que desea realizar).
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);