Importation de fichiers multiples, filtrage de fichiersBonjour à tous,
Débutant JSL ici ! J'ai besoin d'importer plusieurs fichiers, où les noms de fichiers importés ont certains paramètres qui doivent être respectés.
- Ne peut pas contenir certains caractères.Ces caractères sont toujours à la fin du nom de fichier.
- Doit inclure une certaine chaîne
- S'il existe des segments de chaîne identiques dans les noms de fichiers trouvés, seul celui avec l'horodatage système le plus récent est importé. J'ai besoin d'un moyen de découper et de comparer des parties de noms de fichiers.
Ex : Je veux toutes les boissons smoothies aux fruits contenant "Pomme", mais pas "Tomate". (nom du fichier, date et heure AAAAMMJJ HHMM)
Kiwi_Pomme_Mangue.csv 20220125 1421
Apple_Grape_Kiwi.csv 20220125 1243
Durien_Tomate.csv 20220126 1607
Apple_Grape_Kiwi_Tomato.csv 20220126 1537
Mangue_Banane_Durien.csv 20220126 0915
Raisin_Ananas_Pomme_Avocat.csv 20220126 0711
Apple_Grape_Kiwi.csv 20220127 1111
La dénomination des fichiers a une structure.La chaîne que je recherche est après plusieurs délimiteurs.
Demandes supplémentaires
- Existe-t-il des astuces pour accélérer la recherche de ces fichiers dans un dossier contenant plusieurs milliers de fichiers ?Je ne peux filtrer par extension qu'après la recherche initiale. Actuellement, il faut même plusieurs minutes pour rechercher et trouver tous les fichiers de ce dossier.
- Des conseils pour importer un nombre croissant de fichiers ? Le nombre de fichiers importés dépassera probablement les 1000 dans quelques mois.Tous ont la même structure de données.Je suis conscient que j'ai besoin "d'empiler des fichiers similaires".Ce sont tous des tableaux de données.
J'ai recherché les fonctions Words et Munger, mais je ne suis pas sûr qu'elles soient ce dont j'ai besoin pour terminer le script d'importation de fichiers.
Accès aux donnéesles fenêtresRe : Importation de fichiers multiples, filtrage de fichiersMerci!L'élément Contient avec Pat Regex semble faire l'affaire !
Re : Importation de fichiers multiples, filtrage de fichiersOui, mais il est difficile de dire lequel vous conviendra le mieux.
Vous pourrez peut-être utiliser contains() et ignorer complètement les délimiteurs _. Je ne sais pas si les jetons ananas et pomme sont un problème ou non, mais ils pourraient l'être puisque l'un contient l'autre. Raisin et Pamplemousse aussi. Peut-être que les majuscules/minuscules résolvent le problème ?
Vous voudrez peut-être en savoir plus sur les regex. (J'ai utilisé expressions-régulières.info .) Cette fonction renvoie la correspondance de caractères ou une valeur numérique manquante
regex("applepearorange","carrot|pear")
Vous pouvez l'utiliser avec isstring(...) ou ismissing(...) pour obtenir une réponse vrai/faux. Le | dans la regex est pour les alternatives.
Vous pouvez également utiliser une expression régulière avec contains_item(). Je ne l'ai jamais utilisé sauf pour ce test rapide, et c'est le seul moyen que j'ai trouvé pour lui passer un modèle :
Contains Item( "apple_grapefruit_lime", Pat Regex( "carrot|grape" ), "_" )
Ce qui signifie diviser l'entrée sur _ et tester chaque segment avec la regex.
Re : Importation de fichiers multiples, filtrage de fichiersJ'ai maintenant modifié mon code comme ci-dessous, et cela fonctionne, mais pas de manière optimale. "abc" n'est pas toujours seul et séparé entre les délimiteurs "_".Par exemple, parfois je peux avoir "_xyzabc_", ou "_abcxyz_". Existe-t-il une fonction qui parcourt toute la chaîne pour trouver cet ensemble de caractères ?La chaîne est toujours dans une certaine position dans la chaîne.
files_list = Files In Directory( "C:\Data\" );
dt = Current Data Table();
For( i = 1, i <= N Rows( dt ), i++,
if( Contains Item(:Column 1[i], "abc", "_") == 1,
dt <<DELETE row=""></DELETE>
Re : Importation de fichiers multiples, filtrage de fichiersJ'ai réalisé qu'une partie du problème était liée à l'état de mon instruction if, j'ai donc révisé le code ci-dessous.Cela continue toujours, sauf si je modifie le code pour rechercher la sous-chaîne de début de l'ensemble. Ce que je recherche se trouve dans la chaîne et si je recherche en arrière ou en avant, tester uniquement le début ou la fin de la chaîne n'est pas ce que je recherche.
files_list = Files In Directory( "C:\Data\" );
dt = Current Data Table();
For( i = 1, i <= N Rows( dt ), i++,
if( contains(:Column 1[i], "abc") == 1,
dt <<DELETE row=""></DELETE>
Re : Importation de fichiers multiples, filtrage de fichiersBonjour, j'ai rempli avec succès une liste de noms de fichiers à l'aide de Files In Directory().J'ai étudié Filter Each(), mais je ne suis pas en mesure d'ajouter autant de conditions que je le voudrais, donc je cherche à enchaîner des instructions conditionnelles If imbriquées dans une boucle For. En arrière-plan, j'ai un dt de chacun des noms de fichiers, un dans chaque ligne, le tout dans une seule colonne.
Fondamentalement, je veux inspecter chaque élément en utilisant ! contient () ou contient () et supprimer la ligne, ou la conserver, en conséquence.Oui, je suis conscient que cela causera des problèmes avec le compteur "i".Le compteur est assez facile à régler. Une étape à la fois cependant. Lorsque j'exécute ce script, aucune erreur ne s'affiche et rien ne se passe.J'ai vérifié le débogueur et je n'ai trouvé aucun type de compteur pour contains(), donc je suis un peu confus quant à la raison pour laquelle cela ne fonctionne pas.Un aperçu?
files_list = Files In Directory( "C:\Data\" );
dt = Current Data Table();
For( i = 1, i <= N Rows( dt ), i++,
if( :Column 1[i] == contains(:Column 1[i], "abc"),
dt <<DELETE row=""></DELETE>
Re : Importation de fichiers multiples, filtrage de fichiersJe voulais juste dire que je reviendrai sur ce fil. Mon objectif doit être ailleurs au travail en ce moment. Je n'ai pas oublié.
Re : Importation de fichiers multiples, filtrage de fichiers(dé-mis en quarantaine, désolé, j'espère avoir choisi le bon, pas évident pourquoi il a été signalé.)
contains() est une fonction que vous pouvez utiliser, élément par élément, sur la liste des fichiers renvoyés par FilesInDirectory(...).
Vous pouvez transmettre des noms de fichiers au filtre qui ressemblent à ceci :
??pomme*poire*.csv
Chaque ? correspond à 1 et chaque * correspond à 0 ou plus.w9apple_fig_pear_grape.csv correspondrait.
Vous pourriez probablement utiliser quelque chose comme ça
list = files in directory("$desktop",recursive(1));
list = filtereach({name},list,contains(name,".txt"));
namefilterdata = concatitems(list,";");
pour créer la valeur à transmettre au filtre de nom de l'IMF.
La liste <Re : Importation de fichiers multiples, filtrage de fichiers
Lorsque j'ajoute ! Contient (partie, "Tomate") ou Contient (partie, "Pomme"), le script est bloqué en boucle pour découvrir les fichiers dans le dossier que je recherche. L'importation de données ne se produit jamais réellement. Des idées sur pourquoi cela se produit?
Je copierais le code ici, mais il est constamment signalé comme spam pour une raison quelconque
Re : Importation de fichiers multiples, filtrage de fichiersBonjour jthi,
Dès que j'ajoute Contient au script, il continue de boucler pour rechercher des fichiers dans le dossier et n'importe jamais les données. Des conseils ?
Multiple File Import(
<<SET folder=""></SET>
Re : Importation de fichiers multiples, filtrage de fichiersMerci pour votre réponse, jthi!Je vais pouvoir tester ça début de semaine prochaine et je reviens vers vous.
Importation de fichiers multiples, filtrage de fichiersJ'obtiendrais d'abord une liste de fichiers. Il existe de nombreuses méthodes pour effectuer cette opération dans JMP et celles à utiliser dépendent des exigences de vitesse (et des éventuelles exigences en matière de données) dont vous disposez.Pour obtenir une liste des fichiers que vous pouvez utiliser, vous pouvez utiliser les commandes du système d'exploitation (dans la ligne de commande Windows, il y a dir et dans powershell par exemple get-childitem (docs.microsoft.com) pour obtenir la liste des fichiers ou directement avec JMP vous pouvez utiliser Files In Directory() ou Multiple File Import() (voir Arborescence des répertoires : explorer l'espace utilisé par les dossiers pour l'exemple de l'IMF).
Une fois que vous avez une liste de fichiers dans une liste ou dans une table de données JMP, vous pouvez commencer à la filtrer avec un algorithme. Voici quelques idées :
- Utilisez Ends With() pour vérifier la fin de la chaîne
- Utilisez Contient() pour vérifier certaines chaînes et !Contains() pour exclure d'autres chaînes
- Pour des segments identiques (s'agit-il d'un seul mot commun, d'une combinaison de mots, de mots dans un ordre spécifique...)Words() et Associative Arrays() sont très probablement utiles ici
- Voir la section Index de script pour les fonctions de caractère pour plus d'idées
Sans savoir comment la table de données sera utilisée, il est un peu difficile de donner de bons conseils sur les demandes supplémentaires, en plus des moyens optionnels de charger la liste initiale des fichiers. Une option consisterait à créer la table de données avec certaines tâches planifiées afin qu'elle soit prête pour les utilisateurs lorsqu'ils en ont besoin.
Re : Importation de fichiers multiples, filtrage de fichiersSalut, je n'arrive pas à comprendre comment exclure tout nom de fichier avec tomate pendant MFI. Comment puis-je définir le filtre de nom chez MFI. Merci pour l'aide