Importación de archivos múltiples, filtrado de archivosHola a todos,
JSL novato aquí! Necesito importar varios archivos, donde los nombres de los archivos que se importan tienen algunos parámetros que deben cumplirse.
- No puede contener ciertos caracteres.Estos caracteres siempre se encuentran al final del nombre del archivo.
- Debe incluir una determinada cadena
- Si hay segmentos de cadena idénticos dentro de los nombres de archivo encontrados, solo se importa el que tiene la marca de fecha y hora del sistema más reciente. Necesito una forma de cortar y comparar partes de nombres de archivos.
Ejemplo: Quiero todas las bebidas de batidos de frutas que contengan "Manzana", pero no "Tomate". (nombre del archivo, fecha y hora AAAAMMDD HHMM)
Kiwi_Apple_Mango.csv 20220125 1421
Apple_Grape_Kiwi.csv 20220125 1243
Durien_Tomato.csv 20220126 1607
Apple_Grape_Kiwi_Tomato.csv 20220126 1537
Mango_Banana_Durien.csv 20220126 0915
Grape_Pineapple_Apple_Avocado.csv 20220126 0711
Apple_Grape_Kiwi.csv 20220127 1111
La denominación de los archivos tiene estructura.La cadena que estoy buscando está detrás de múltiples delimitadores.
Preguntas adicionales
- ¿Hay algún consejo para acelerar la búsqueda de estos archivos en una carpeta donde se almacenan muchos miles de archivos?Solo puedo filtrar por extensión después de la búsqueda inicial. Actualmente, toma muchos minutos incluso buscar y encontrar todos los archivos en esta carpeta.
- ¿Algún consejo para importar un número creciente de archivos? Es probable que la cantidad de archivos importados supere los 1000 en unos meses.Todos ellos tienen la misma estructura de datos.Soy consciente de que necesito "Apilar archivos similares".Estas son todas las tablas de datos.
Busqué las funciones Words y Munger, pero no estoy seguro de que sean lo que necesito para completar el script de importación de archivos.
Acceso a los datosventanasRe: Importación de archivos múltiples, filtrado de archivos¡Gracias!¡El elemento Contiene con Pat Regex parece funcionar!
Re: Importación de archivos múltiples, filtrado de archivosSí, pero es difícil decir cuál será mejor para ti.
Es posible que pueda usar contains() e ignorar los delimitadores _ por completo. No sé si las fichas piña y manzana son un problema o no, pero podrían serlo ya que uno contiene al otro. Uva y Pomelo también. ¿Quizás mayúsculas/minúsculas lo resuelve?
Es posible que desee aprender sobre expresiones regulares. (Solía expresiones-regulares.info .) Esta función devuelve la coincidencia de caracteres o un valor numérico faltante
regex("applepearorange","carrot|pear")
Puede usarlo con isstring(...) o ismissing(...) para obtener una respuesta verdadera/falsa. el | en la expresión regular es para alternativas.
También puede usar una expresión regular con contains_item(). Nunca lo he usado excepto para esta prueba rápida, y esta es la única forma que encontré para pasarle un patrón:
Contains Item( "apple_grapefruit_lime", Pat Regex( "carrot|grape" ), "_" )
Lo que significa dividir la entrada en _ y probar cada segmento con la expresión regular.
Re: Importación de archivos múltiples, filtrado de archivosAhora modifiqué mi código como se muestra a continuación y funciona, pero no es óptimo. "abc" no siempre está solo y separado entre los delimitadores "_".Por ejemplo, a veces puedo tener "_xyzabc_" o "_abcxyz_". ¿Existe una función que recorre toda la cadena para encontrar este conjunto de caracteres?La cadena siempre está en una determinada posición dentro de la cadena.
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>
Re: Importación de archivos múltiples, filtrado de archivosMe di cuenta de que parte del problema está en la condición de mi declaración if, por lo que revisé el código a continuación.Siempre continúa, a menos que edite el código para buscar la subcadena inicial del todo. Lo que estoy buscando está dentro de la cadena y si busco hacia atrás o hacia adelante, solo probar el principio o el final de la cadena no es lo que estoy buscando.
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>
Re: Importación de archivos múltiples, filtrado de archivosHola, llené con éxito una lista de nombres de archivos usando Files In Directory().Investigué Filter Each(), pero no puedo agregar tantas condiciones como me gustaría, así que busco encadenar algunas declaraciones If condicionales anidadas en un bucle For. En el fondo tengo un dt de cada uno de los nombres de archivo, uno en cada fila, todo en una sola columna.
Básicamente, quiero inspeccionar cada elemento usando !contains() o contains() y eliminar la fila, o conservarla, según corresponda.Sí, soy consciente de que esto causará problemas con el contador "i".El contador es bastante fácil de ajustar. Un paso a la vez. Cuando ejecuto este script, no aparece ningún error y no sucede nada.Revisé el depurador y no pude encontrar ningún tipo de contador para contains(), por lo que estoy un poco confundido sobre por qué esto no funciona.¿Alguna idea?
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>
Re: Importación de archivos múltiples, filtrado de archivosSolo quería decir que volveré a este hilo. Mi enfoque debe estar en otra parte en el trabajo en este momento. no he olvidado
Re: Importación de archivos múltiples, filtrado de archivos(retirado de la cuarentena, lo siento, espero haber elegido el correcto, no es obvio por qué se marcó).
contiene () es una función que podría usar, elemento por elemento, en la lista de archivos devueltos de FilesInDirectory (...).
Puede pasar nombres de archivo al filtro que se vean así:
??manzana*pera*.csv
Cada ? coincide con 1 y cada * coincide con 0 o más.w9apple_fig_pear_grape.csv coincidiría.
Probablemente podrías usar algo como esto
list = files in directory("$desktop",recursive(1));
list = filtereach({name},list,contains(name,".txt"));
namefilterdata = concatitems(list,";");
para crear el valor para pasar al filtro de nombre de MFI.
La lista <
Re: Importación de archivos múltiples, filtrado de archivosCuando agrego ! Contiene (parte, "Tomate") o Contiene (parte, "Apple"), el script se atasca en el bucle de descubrimiento de los archivos en la carpeta que estoy buscando. La importación de datos en realidad nunca sucede. ¿Alguna idea de por qué sucede esto?
Copiaría el código aquí, pero constantemente se informa como correo no deseado por alguna razón.
Re: Importación de archivos múltiples, filtrado de archivosHola Jti,
Tan pronto como agrego Contiene al script, sigue en bucle para encontrar archivos en la carpeta y nunca importa los datos. ¿Algun consejo?
Multiple File Import(
<<SET folder=""></SET>
Re: Importación de archivos múltiples, filtrado de archivos¡Gracias por tu respuesta, Jthi!Podré probar esto a principios de la próxima semana y te responderé.
Importación de archivos múltiples, filtrado de archivosPrimero obtendría una lista de archivos. Hay muchos métodos para hacer esto en JMP y cuál usar depende de los requisitos de velocidad (y posibles requisitos de datos) que tenga.Para obtener una lista de archivos que puede usar, puede usar los comandos del sistema operativo (en la línea de comandos de Windows hay dir y en powershell, por ejemplo). get-childitem (docs.microsoft.com) para obtener la lista de archivos o directamente con JMP, puede usar Archivos en directorio() o Importación de archivos múltiples() (ver Árbol de directorios: Explore el espacio utilizado por las carpetas para ejemplo de IMF).
Una vez que tenga una lista de archivos en una lista o en una tabla de datos JMP, puede comenzar a filtrarla con algún algoritmo. Aquí hay algunas ideas:
- Use Termina con () para verificar el final de la cadena
- Use Contiene () para verificar cierta cadena y ! Contiene () para excluir otras cadenas
- Para segmentos idénticos (es solo una palabra común, combinación de palabras, palabras en un orden específico...)Words() y Associative Arrays() probablemente sean útiles aquí
- Consulte la sección Índices de secuencias de comandos para funciones de caracteres para obtener más ideas.
Sin saber cómo se utilizará la tabla de datos, es un poco difícil dar buenos consejos sobre las solicitudes adicionales, además de las formas opcionales de cargar la lista inicial de archivos. Una opción sería crear la tabla de datos con algunas tareas programadas para que esté lista para los usuarios cuando la necesiten.
Re: Importación de múltiples archivos, filtrado de archivosHola, no puedo entender cómo quiero excluir cualquier nombre de archivo con tomate durante la MFI. ¿Cómo puedo configurar el filtro de nombres en MFI? gracias por la ayuda