Ho diverse cartelle e all'interno di ogni cartella ci sono diversi file CSV. Ogni file CSV ha circa 500.000 righe. Uso uno script JSL per concatenare tutti i file CSV all'interno di ciascuna cartella in una tabella JMP. Questo processo viene ripetuto su ogni cartella e quindi alla fine ci sono tante tabelle JMP concatenate quante sono le cartelle. Ma ci vuole molto tempo.
Ho cercato la programmazione parallela in JSL e sono venuto a conoscenza di Parallel Assign. Ho bisogno di una guida su come inserire lo script sottostante all'interno di Assegna parallela per accelerare la concatenazione. Lo apprezzerò molto.
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
);Dai un'occhiata a File-> MultipleFileImport. Può scavare attraverso directory annidate, selezionare in base a modelli di nome file e concatenare file simili. Ed è più veloce rispetto all'utilizzo di open () su un CSV, di solito anche per un singolo file. Crea anche uno script che puoi modificare e riutilizzare. Può aggiungere una colonna con le informazioni sul file di origine.
Inizia in modo interattivo, cerca la casella di controllo per mantenere la finestra aperta, fai un paio di esperimenti.
La GUI ha quattro filtri che scelgono i file selezionati.Il filtro cartella / nascosto / ricorsivo è sempre visibile e ci sono tre caselle di controllo da mostrare e abilitare i filtri per nome file, ora file e dimensioni file. L'elenco dei file mostra cosa è selezionato; è non per selezionare i file.
Nel peggiore dei casi, puoi usare MFI su ogni directory, una alla volta, e probabilmente ottenere una buona velocità. Nel migliore dei casi potrebbe fare quello che vuoi sull'intero nido di directory.
Parallel Assign è progettato per compilare un array E per eseguire il JSL che riempie ogni elemento dell'array in un ambiente isolato che previene gli errori tra i thread. Cerca di evitare cose come l'accesso a una tabella dati contemporaneamente da due thread diversi. Se trovi un modo per arrivarci, probabilmente andrà in crash.
Grazie mille. Sono stato in grado di incorporare Importa più file nel mio script e ora è in grado di concatenare le tabelle molto più velocemente.