Tengo varias carpetas y dentro de cada carpeta hay varios archivos CSV. Cada archivo CSV tiene alrededor de 500.000 filas. Utilizo un script JSL para concatenar todos los archivos csv dentro de cada carpeta en una tabla JMP. Este proceso se repite en cada carpeta y, por lo tanto, al final hay tantas tablas JMP concatenadas como no de carpetas. Pero lleva mucho tiempo.
Busqué programación paralela en JSL y llegué a conocer Parallel Assign. Necesito orientación sobre cómo colocar el siguiente script dentro de Parallel Assign para acelerar la concatenación. Te lo agradeceré mucho.
path = munger(Pick Directory( "Browse to the Directory of the .txt / .csv files " ),1,"/","");
Print(dirList(path));
folderlist={};
folderlist = dirList(path);
count=nitems(folderlist);
//prefolderlist = Files In Directory( path );
//filepath = Convert File Path(path, Windows )
For( j2 = 1, count >= j2, j2++,
folderpath= path || folderlist[j2] || "/" ;
Print(folderpath);
prefilelist = Files In Directory( folderpath );
n2=nitems(prefilelist);
filelist = {};
//filter out any non-txt or csv files
For( i2 = 1, n2 >= i2, i2++,
file=(prefilelist[i2]);
If( Item( 2, prefilelist[i2], "." ) == "txt" | Item( 2, prefilelist[i2], "." ) == "csv",
Insert Into( filelist,file),
show(file)
)
);
nf=nitems(filelist); //number of items in the working list
cctable= New Table( "Combined data table ");//make an empty table
cctable<<New Column( "Source", Character, Nominal );
For( iii = 1 , iii <= nf, iii++, //this starts the first loop
filenow = ( filelist[iii] );
fileopen=(folderpath||filenow);
//dt=open(fileopen,private);
dt=open(fileopen,importset,private);//Import settings used in the open argument
New Column( "Source", Character, Nominal );
:Source << set each value( filenow );
//dt<<new column("Source", character, nominal)<<set each value(9999);
dt << Run Formulas();
//add the current table to the bottom of the combined data table
cctable << Concatenate( Data Table( dt ), Append to first table );
//don't use "Create Source Column" argument
Close( dt, NoSave );//after concatenating the table, close it and move on
);//end of the first for loop
);Eche un vistazo a Archivo-> MultipleFileImport. Puede explorar directorios anidados, seleccionar por patrones de nombre de archivo y concatenar archivos similares. Y es más rápido que usar open () en un CSV, generalmente incluso para un solo archivo. También crea un script que puede modificar y reutilizar. Puede agregar una columna con información del archivo de origen.
Comience de forma interactiva, busque la casilla de verificación para mantener la ventana abierta, haga un par de experimentos.
La GUI tiene cuatro filtros que eligen los archivos seleccionados.El filtro de carpeta / oculto / recursivo siempre está visible, y hay tres casillas de verificación para mostrar y habilitar los filtros de nombre de archivo, tiempo de archivo y tamaño de archivo. La lista de archivos muestra lo que está seleccionado; es no para seleccionar archivos.
En el peor de los casos, puede usar MFI en cada directorio, uno a la vez, y probablemente obtenga una buena velocidad. En el mejor de los casos, podría hacer lo que quieras en todo el nido de directorios.
Parallel Assign está diseñado para completar una matriz Y para ejecutar el JSL que completa cada elemento de la matriz en un entorno aislado que evita errores entre subprocesos. Intenta evitar cosas como acceder a una tabla de datos al mismo tiempo desde dos subprocesos diferentes. Si encuentra una manera de hacerlo, probablemente se bloqueará.
Muchas gracias. Pude incorporar Importar múltiples archivos en mi script y ahora puedo concatenar tablas mucho más rápido.