¿Cómo utilizar recursivo para concatenar archivos CSV en carpetas?Hola, ¿alguien puede ayudarme a modificar este código?Estoy intentando concatenar archivos csv por carpeta. El usuario deberá seleccionar una carpeta y todas las carpetas csv calificadas se concatenarán y guardarán según el nombre de la carpeta. Este método hace que el usuario elija una carpeta por ejecución de script.
Sin embargo, lo que estoy tratando de hacer ahora es hacer que el usuario elija la carpeta principal, luego ejecute el script y concatene los datos por subcarpetas (guardándolos individualmente con su nombre de carpeta como nombre de archivo como en el método anterior).
Pero con este código, todos los archivos csv se concatenan en un solo archivo. ¿Puedes ayudar a modificar y explicar cómo funciona la recursividad? ¿Y cómo puedo guardar estos archivos individualmente (concatenar datos por carpeta) con solo abrir la carpeta principal? Estoy usando JMP 15. Gracias
p = pick Directory("Select a Folder");<BR />//f = Files In Directory(p);
f = Files In Directory(p, recursive(1));
Dir = Word(-1, p, "/"); //get filename
saveDir = Substr( p, 1, Length( p ) - Length( Word( -1, p, "\/" ) ) - 1 ); //save file outside main folder
/* Removes the file names from the list f which are not CSV files */
for(j=1,j<=N Items(f),j++,
If (Substr(f[j],Length(f[j])-2,3)!= "CSV",
RemoveFrom(f,j,1);
j=j-1;
);
);
A = {}; /* creates a empty list for storing the names of each data table */
B = {};
C = {};
D = {};
k = {};
m = {};
/*Opens each one of the CSV files and deletes all unwanted rows */
for(j=1,j<=N Items(f),j++,
CSV = Open(Concat(p,f[j]), End of Field(comma), Strip Quotes(1), Labels(1),
Column Names Start(3), Data Starts(4), Columns(:MRR=Numeric));
colname = {};
colname = CSV<<GET column="" names="">20 & Contains(colname,"Weight")>50,
InsertInto(A,CSV);
CSV<<SELECT where="">1,
dt2 = dt1<<CONCATENATE>1,
dt3 = dt1<<CONCATENATE></CONCATENATE></CONCATENATE></SELECT></GET>Automatización y secuencias de comandosRe: ¿Cómo utilizar recursivo para concatenar archivos CSV en carpetas?¿Qué necesita que le expliquen sobre la opción recursiva (1)?
Names Default To Here(1);
Files In Directory("$SAMPLE_DATA", recursive(1));
Sin esa opción, solo obtendrás el primer nivel de archivos en la carpeta y, cuando uses recursivo, también obtendrás las subcarpetas y los archivos dentro de ellas.

Los resaltados están ahí solo porque se configuró recursivo (1).
Respecto a tu script: ¿cuántos niveles de carpetas tienes? ¿podría cambiar? Si hay varios niveles hasta que se encuentren los archivos .csv, ¿cuál debería ser el nombre del archivo?
Re: ¿Cómo utilizar recursivo para concatenar archivos CSV en carpetas?Aquí hay una secuencia de comandos inicial que lee todos los archivos recursivos y los concatena en tablas de datos separadas, según la carpeta en la que se encontraron.
No incluí todas sus comprobaciones de errores individuales, etc. Debería poder modificar mi ejemplo para volver a colocar esas cosas en el código.
Hay una diferencia de estructura en este código.el JSL lee un archivo y luego lo concatena antes de leer el siguiente archivo.Revisé todo lo que pude pero aún podría tener problemas.
names default to here(1);
p = pick Directory("Select a Folder");//f = Files In Directory(p);
f = Files In Directory(p, recursive(1));
for(i=nitems(f),i>=1,i--,
if(uppercase(word(-1,f[i],"."))!="CSV",
remove from(f,i,1)
)
);
// Create the Associative Array with all of the files, with their directories
// Place all data into a data table, and then move into an Associative Array which will give the
// folder(data table to concatenate to)
dt= new table("The Files", new column("File", character));
dt << add rows(nitems(f));
dt:file<<SET values=""></SET>Re: ¿Cómo utilizar recursivo para concatenar archivos CSV en carpetas?Hola, solo tengo dos niveles de carpetas: la carpeta principal y luego las carpetas múltiples con el CSV adentro. A continuación se muestra un ejemplo de salida del script sin utilizar recursivo. Lo que me gustaría hacer es que cuando se ejecute el script, solo se seleccione la carpeta principal y el script tendrá un resultado como este.

Re: ¿Cómo utilizar recursivo para concatenar archivos CSV en carpetas?Puede obtener fácilmente el nombre de la carpeta usando Word() con índice negativo. Ejemplo a continuación
Names Default To Here(1);
foldername = Word(-1, "F1/1.jmp", "/\"); //"1.jmp"
Lo más probable es que cree una matriz asociativa en la que las claves sean los nombres de las carpetas. Luego recorrería la lista de archivos y verificaría si la carpeta no existe ya en la matriz asociativa, luego la agregaría allí e inicializaría su valor como una lista vacía. Luego puede usar insertar en para agregar las rutas de los archivos a esa matriz asociativa para corregir las claves (use las rutas completas para que sea más fácil abrir los archivos). Después de haber repasado la lista de archivos, realice otro bucle sobre la matriz asociativa. Esta vez abre los archivos y concatenalos a medida que avanzas.
Re: ¿Cómo utilizar recursivo para concatenar archivos CSV en carpetas?Hola, tengo una pregunta sobre esta línea de código ya que todavía estoy usando JMP 15. ¿Cómo puedo traducir esto a JMP 15 (formato de bucle for)? Estoy un poco confundido sobre qué es {table} cuando está en formato de bucle for en JMP 15. Y también, ¿cómo puedo guardar estos archivos CSV en consecuencia? Para mi ejemplo es por sexo. Por lo tanto, los nombres de los archivos deben guardarse por sexo (Male.csv y Female.csv).
For Each( {table}, theArray << get keys,
stable = theArray << get value( table );
stable = Substitute( stable, ":", "-" );
stable = Substitute( stable, "/", "-" );
If( Try( Data Table( stable ) << get name, "" ) == "",
dt = New Table( theArray << get value( table ) ),
dt = Data Table( stable )
);
Re: ¿Cómo utilizar recursivo para concatenar archivos CSV en carpetas?Creo que esto debería funcionar:
arrayKeys = theArray << get keys;
For(i=1, i <=nitems( arrayKeys), i++,
table = arrayKeys[i];
stable = theArray << get value( table );
stable = Substitute( stable, ":", "-" );
stable = Substitute( stable, "/", "-" );
If( Try( Data Table( stable ) << get name, "" ) == "",
dt = New Table( theArray << get value( table ) ),
dt = Data Table( stable )
);