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 número de carpetas. Pero lleva mucho tiempo.
Busqué programación paralela en JSL y conocí 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
);Muchas gracias. Pude incorporar Importar varios archivos en mi script y ahora puedo concatenar tablas mucho más rápido.
Eche un vistazo a Archivo->Importación de archivos múltiples. Puede explorar directorios anidados, seleccionar por patrones de nombres de archivos 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 puedes modificar y reutilizar. Puede agregar una columna con información del archivo fuente.
Comience de forma interactiva, busque la casilla de verificación para mantener la ventana abierta y 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 permitir los filtros de nombre de archivo, hora 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 obtener una buena aceleración. En el mejor de los casos, podría hacer lo que desee en todo el conjunto de directorios.
Parallel Assign está diseñado para completar una matriz Y 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á.