J'ai plusieurs dossiers et dans chaque dossier, il y a plusieurs fichiers CSV. Chaque fichier CSV contient environ 500 000 lignes. J'utilise un script JSL pour concaténer tous les fichiers csv à l'intérieur de chaque dossier dans une table JMP. Ce processus est répété sur chaque dossier et donc à la fin il y a autant de tables JMP concaténées que le nombre de dossiers. Mais cela prend beaucoup de temps.
J'ai recherché la programmation parallèle dans JSL et j'ai découvert Parallel Assign. J'ai besoin de quelques conseils sur la façon de mettre le script ci-dessous dans Parallel Assign pour accélérer la concaténation. Je l'apprécierai grandement.
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
);Jetez un œil à File-> MultipleFileImport. Il peut fouiller dans des répertoires imbriqués, sélectionner des modèles de noms de fichiers et concaténer des fichiers similaires. Et c'est plus rapide que d'utiliser open () sur un CSV, généralement même pour un seul fichier. Il crée également un script que vous pouvez modifier et réutiliser. Il peut ajouter une colonne avec des informations sur le fichier source.
Commencez de manière interactive, recherchez la case à cocher pour garder la fenêtre ouverte, faites quelques expériences.
L'interface graphique dispose de quatre filtres qui choisissent les fichiers sélectionnés.Le filtre dossier / caché / récursif est toujours visible, et il y a trois cases à cocher à afficher et activer le nom de fichier, l'heure du fichier et les filtres de taille de fichier. La liste des fichiers montre ce qui est sélectionné; il est ne pas pour sélectionner des fichiers.
Dans le pire des cas, vous pouvez utiliser MFI sur chaque répertoire, un à la fois, et probablement obtenir une bonne vitesse. Dans le meilleur des cas, il peut faire ce que vous voulez sur l'ensemble des répertoires.
Parallel Assign est conçu pour remplir un tableau ET pour exécuter le JSL qui remplit chaque élément du tableau dans un environnement isolé qui empêche les erreurs entre les threads. Il essaie d'éviter des choses comme accéder à une table de données en même temps à partir de deux threads différents. Si vous trouvez un moyen d'y accéder, il plantera probablement.
Merci beaucoup. J'ai pu incorporer Import Multiple Files dans mon script et il est maintenant capable de concaténer des tables beaucoup plus rapidement.