Extraire et concaténer des fichiers CSV à partir de dossiers ayant la même structure<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Salut,
J'ai tout un tas de fichiers CSV dans différents dossiers qui ont un nom commun et le fichier CSV est dans la même structure, par exemple
<1er dossier>dfgdwgssd
<2ème dossier ayant un nom commun> nom commun
xxx-nomcommun.csv
Je pense utiliser un script pour extraire et concaténer tous les fichiers CSV. J'ai trouvé un moyen simple avec les commandes bash (boucle "for" avec "find"), quelqu'un pourrait-il me donner un coup de main ? Merci beaucoup!
Re : Extraire et concaténer des fichiers CSV à partir de dossiers ayant la même structureMerci encore Phil!
J'utilise Mac et je viens de chercher sur Google et j'ai trouvé peu d'informations sur l'exécution du shell à partir de JMP. Avez-vous quelques exemples ?
Re : Extraire et concaténer des fichiers CSV à partir de dossiers ayant la même structureBien sûr, mon plaisir! J'essayais de souligner que vous pouvez toujours utiliser JMP pour récupérer la liste complète des fichiers, puis utiliser REGEX pour rechercher les noms de fichiers contenant . En effet, j'imagine qu'avec plus de 1 300 dossiers, cela pourrait prendre un certain temps.
Quelques conseils sur la vitesse :
- L'impression dans le journal ralentit les choses.
- De plus, j'ouvrirais d'abord tous les fichiers avant de concaténer et de fermer chacun d'eux.
*Si vous utilisez un Mac, vous pouvez lancer un script shell depuis JMP. Sous Windows, à moins que vous n'utilisiez Cygwin ou quelque chose du genre, Powershell est une bonne option pour écrire des procédures utilitaires pouvant être appelées depuis JMP.
Phil
Re : Extraire et concaténer des fichiers CSV à partir de dossiers ayant la même structureSalut Phil,
Merci beaucoup pour vos conseils ! Cependant, je n'ai pas exécuté votre script.
J'utilisais une petite quantité de dossiers pour essayer et j'ai réalisé plus tard que cela prenait du temps avec une grande quantité de dossiers (disons > 1 300), car JMP ira dans le 2ème répertoire et extraira le fichier *.csv et ainsi de suite, très très longtemps. consommer cependant.
Afin d'améliorer l'efficacité, j'ai pensé à utiliser bash pour déplacer tous les fichiers csv vers un dossier, puis les concaténer. Une vérification rapide pour utiliser bash pour ce faire (extraire et concaténer des fichiers csv) avec > 1 300 dossiers m'a pris 3 secondes avec un fichier csv concaténé de 13 Mo, 3 secondes !!! Je devrai examiner la possibilité d'exécuter la commande bash dans JSL.
d'ailleurs,
dt = Open( dirpath || TheFileList,invisible );
ne fera pas apparaître la table de données pendant le traitement
Merci encore!
Re : Extraire et concaténer des fichiers CSV à partir de dossiers ayant la même structureSalut jjw ,
En plus de la suggestion de Jim, vous pouvez essayer l'approche généralisée suivante pour sélectionner les fichiers souhaités. Voir ci-dessous par exemple :
allFiles = FilesInDirectory("$Documents", recursive);
selectedFiles = {};
commonName = "BrownP";
For( i = 1, i<=NItems(allFiles), i++,
If( !IsMissing( Regex(allFiles, EvalInsert(".*<COMMONNAME>.*\.csv","<",">" )) ),
InsertInto(selectedFiles, allFiles);
)
);</COMMONNAME>
1. Récupérez tous les noms de fichiers dans le dossier Mes documents et ses sous-dossiers. (Remplacez par le chemin de votre dossier de niveau supérieur).
2. Créez une liste vide pour stocker les noms de fichiers souhaités.
3. Définissez la chaîne commonName.
4. Parcourez tous les noms de fichiers, en sélectionnant uniquement ceux qui correspondent au modèle et stockez-les dans le Fichiers sélectionnés liste. Dans cet exemple Je récupère tous les fichiers CSV contenant "BrownP" dans le nom de fichier. (Remplacez par votre propre chaîne commonName).
Donc, l'implémentation complète (en utilisant le code de Jim du post précédent) :
Names Default To Here( 1 );
// Setup an empty table to start to concatenate other tables to
dtbase = New Table( "Base Table" );
// Have the user select the starting folder
dirpath = Pick Directory( "Pick the Top Level Directory" );
// Get all of the files in all of the folders that are under the picked folder
TheFileList = Files In Directory( dirpath, "recursive" );
// Define common string to search for
commonName = "file";
// Go through all of the files and read in append those that meet your
// requirement. You will need to amend the IF statement to meet your criteria
For( i = 1, i <= N Items( TheFileList ), i++,
If( !Is Missing( Regex( TheFileList, Eval Insert( ".*<COMMONNAME>.*\.csv", "<", ">" ) ) ),
dt = Open( dirpath || TheFileList );
dtbase = dtbase << concatenate( dt, append to first table( 1 ) );
Close( dt, nosave );
)
);</COMMONNAME>
J'espère que cela t'aides!
Meilleur,
Phil
Re : Extraire et concaténer des fichiers CSV à partir de dossiers ayant la même structure
Names Default To Here( 1 );
// Setup an empty table to start to concatenate other tables to
dtbase = New Table( "Base Table" );
// Have the user select the starting folder
dirpath = Pick Directory( "Pick the Top Level Directory" );
// Get all of the files in all of the folders that are under the picked folder
TheFileList = Files In Directory( dirpath, "recursive" );
// Go through all of the files and read in append those that meet your
// requirement. You will need to amend the IF statement to meet your criteria
For( i = 1, i <= N Items( TheFileList ), i++,
If( Uppercase( Word( -1, TheFileList[i], "." ) ) == "CSV" & Is File( dirpath || TheFileList[i] ) == 1,
If( Contains ( TheFileList[i], "<2nd folder common name"),
If( Contains (TheFileList[i],"<COMMON name="" of="" the="" csvfile="">"),
print(TheFileList[i]);
dt = Open( dirpath || TheFileList[i] );
dtbase = dtbase << concatenate( dt, append to first table( 1 ) );
Close( dt, nosave );
);
);
);
);</COMMON>
ajoutez deux lignes supplémentaires pour que cela fonctionne, l'alignement/le retrait doit cependant être ajusté.
Merci!
Re : Extraire et concaténer des fichiers CSV à partir de dossiers ayant la même structureoui, je sais quel est le "nom commun" pour la 2ème couche et les fichiers csv. Merci!
Re : Extraire et concaténer des fichiers CSV à partir de dossiers ayant la même structureSavez-vous à l'avance quel est le « nom commun » ?Ou avez-vous besoin que le script le comprenne ?Et dans ce cas, y aura-t-il plus d’un nom commun possible trouvé dans le dossier ?
Re : Extraire et concaténer des fichiers CSV à partir de dossiers ayant la même structureSalut Jim,
Je l'ai fait fonctionner, mais il répertorie tous les fichiers CSV, j'essaie de trouver le moyen de trier ou de spécifier la 2ème couche. pourriez-vous s'il vous plaît donner un peu plus de conseils ?
Merci!
Re : Extraire et concaténer des fichiers CSV à partir de dossiers ayant la même structureVoici un script qui devrait vous donner un bon départ :
Names Default To Here( 1 );
// Setup an empty table to start to concatenate other tables to
dtbase = New Table( "Base Table" );
// Have the user select the starting folder
dirpath = Pick Directory( "Pick the Top Level Directory" );
// Get all of the files in all of the folders that are under the picked folder
TheFileList = Files In Directory( dirpath, "recursive" );
// Go through all of the files and read in append those that meet your
// requirement. You will need to amend the IF statement to meet your criteria
For( i = 1, i <= N Items( TheFileList ), i++,
If( Uppercase( Word( -1, TheFileList[i], "." ) ) == "CSV" & Is File( dirpath || TheFileList[i] ) == 1,
dt = Open( dirpath || TheFileList[i] );
dtbase = dtbase << concatenate( dt, append to first table( 1 ) );
Close( dt, nosave );
);
);