Comment utiliser la récursive pour concaténer des fichiers CSV dans des dossiers ?Bonjour, quelqu'un peut-il m'aider à modifier ce code ?J'essaie de concaténer des fichiers CSV par dossier. L'utilisateur devra sélectionner un dossier et tous les dossiers csv qualifiés seront concaténés et enregistrés en fonction du nom du dossier. Cette méthode permet à l'utilisateur de choisir un dossier par exécution de script.
Cependant, ce que j'essaie de faire maintenant est de demander à l'utilisateur de choisir le dossier principal, puis d'exécuter le script et de concaténer les données par sous-dossiers (en les enregistrant individuellement avec son nom de dossier comme nom de fichier comme dans la méthode précédente).
Mais avec ce code, tous les fichiers csv sont concaténés en un seul fichier. Pouvez-vous nous aider à modifier et expliquer le fonctionnement récursif ? Et comment puis-je enregistrer ces fichiers individuellement (concaténer les données par dossier) en ouvrant simplement le dossier principal. J'utilise JMP 15. Merci
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>Automatisation et scriptsRe : Comment utiliser la récursive pour concaténer des fichiers CSV dans des dossiers ?De quoi avez-vous besoin d’explications sur l’option récursive(1) ?
Names Default To Here(1);
Files In Directory("$SAMPLE_DATA", recursive(1));
Sans cette option, vous obtiendrez simplement le premier niveau de fichiers dans le dossier et lors de l'utilisation récursive, vous obtiendrez également les sous-dossiers et les fichiers qu'ils contiennent.

Ceux en surbrillance sont là uniquement parce que recursive(1) a été défini.
Concernant votre script : combien de niveaux de dossiers avez-vous ? est-ce que ça pourrait changer ? S'il existe plusieurs niveaux jusqu'à ce que les fichiers .csv soient trouvés, quel doit être le nom du fichier ?
Re : Comment utiliser la récursive pour concaténer des fichiers CSV dans des dossiers ?Voici un script de démarrage qui lit tous les fichiers récursifs et les concatène dans des tables de données distinctes, en fonction du dossier dans lequel ils ont été trouvés.
Je n'ai pas inclus toutes vos vérifications d'erreur individuelles, etc. Vous devriez pouvoir modifier mon exemple pour remettre ces éléments dans le code.
Il existe une différence de structure dans ce code.le JSL lit un fichier, puis le concatène avant de le lire dans le fichier suivant.J'ai vérifié autant que possible, mais il pourrait encore y avoir des problèmes.
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 : Comment utiliser la récursive pour concaténer des fichiers CSV dans des dossiers ?Bonjour, je n'ai que deux niveaux de dossiers : le dossier principal puis les multiples dossiers contenant le CSV à l'intérieur. Voici un exemple de sortie du script sans utiliser de récursion. Ce que je voudrais faire, c'est lorsque le script sera exécuté, seul le dossier principal sera sélectionné et le script aura une sortie comme celle-ci.

Re : Comment utiliser la récursive pour concaténer des fichiers CSV dans des dossiers ?Vous pouvez facilement obtenir le nom du dossier en utilisant Word() avec un index négatif. Exemple ci-dessous
Names Default To Here(1);
foldername = Word(-1, "F1/1.jmp", "/\"); //"1.jmp"
Je créerais très probablement un tableau associatif dont les clés seraient les noms de dossiers. Ensuite, je parcourrais la liste des fichiers et vérifierais si le dossier n'existe pas déjà dans le tableau associatif, puis je l'ajouterais là et initialiserais sa valeur en tant que liste vide. Ensuite, vous pouvez utiliser insert into pour ajouter les chemins de fichiers à ce tableau associatif afin de corriger les clés (utilisez les chemins complets pour faciliter l'ouverture des fichiers). Après avoir parcouru la liste des fichiers, effectuez une autre boucle sur le tableau associatif. Cette fois, ouvrez les fichiers et concaténez-les au fur et à mesure
Re : Comment utiliser la récursive pour concaténer des fichiers CSV dans des dossiers ?Bonjour, j'ai une question dans cette ligne de code car j'utilise toujours JMP 15. Comment puis-je traduire cela en JMP 15 (format de boucle for) Je suis un peu confus quant à ce qu'est {table} lorsqu'il est au format de boucle for dans JMP 15. Et aussi, comment puis-je enregistrer ces fichiers CSV en conséquence ? Pour mon exemple, c'est par sexe. Les noms de fichiers doivent donc être enregistrés par sexe (Male.csv & 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 : Comment utiliser la récursive pour concaténer des fichiers CSV dans des dossiers ?Je pense que cela devrait fonctionner :
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 )
);