Problème
Concaténer des tables de données à l'aide de fichiers dans le répertoire, sans utiliser l'importation de fichiers multiples
Solution
Utilisez Fichiers dans le répertoire pour créer une liste et Concaténer pour les assembler.
// make a test directory
dt = New Table( "Untitled", Add Rows( 1 ), New Column( "a" ), New Column( "b" ) );
path = "$TEMP/test/";
Delete Directory( path ); // Be careful! This will delete your files!
Create Directory( path );
For( i = 1, i <= 3, i += 1,
dt:a = i; // make each table a little different
dt:b = 10 * i;
dt << save( path || Char( 1000 + i ) ); // make the table names sort
);
Close( dt, nosave );
// here's the code to open and concatenate...
namelist = Files In Directory( path );
Sort List Into( namelist ); // not really needed?
dtlist = {}; // hold the opened, hidden, tables here
While( N Items( filename = Remove From( namelist, 1 /*first item*/ ) ) == 1,
filename = filename[1]; // {dt} -> dt
filename = path || filename; // prepend path name
// inserts opened table at end of dtlist
Insert Into( dtlist, Open( filename, invisible ) );
);
rememberdt = dtlist; // need these later to close the hidden tables
firstdt = Remove From( dtlist, 1/*first item*/ )[1]; // need one to start
If( N Items( dtlist ), // concatenate needs more than one table
resultdt = firstdt << Concatenate( dtlist, Create source column )
, // subset returns a fresh table, like concatenate, so both cases have same behavior
resultdt = firstdt << Subset( All rows, Selected columns only( 0 ) )
);
// clean up the hidden tables
While( N Items( closedt = Remove From( rememberdt ) ) == 1, Close( closedt[1], nosave ) );
// clean up new table
resultdt << setname( "all my tables" );
resultdt << deletetableproperty( "Source" ); // from subset or concatenate
//
Print( "done", resultdt );
Discussion
JMP 14 introduit l'importation de fichiers multiples ; @wu remarqué qu'il ne préservait pas certains attributs de table. (JMP 15 devrait faire mieux, mais n'est pas encore disponible.)
La première partie de cet exemple utilise DeleteDirectory et CreateDirectory pour créer un ensemble propre d'exemples de fichiers à tester. Vous pouvez découvrir l'échec de DeleteDirectory si l'une des tables JMP est toujours ouverte depuis une tentative précédente ; vous pouvez fermer les tableaux manuellement, même s'ils sont masqués, à l'aide du widget de tableau
Click the table icon beside the widget to open the hidden tableClick the table icon beside the widget to open the hidden tableCliquez sur l'icône du tableau à côté du widget pour ouvrir le tableau caché
Ce même code ajoute 1000 aux noms de fichiers pour les trier correctement (et non 1,10,2,3,4,5,6,7,8,9 ). La variable de chemin a une barre oblique à la fin, de sorte que la barre oblique n'a pas besoin d'être ajoutée à d'autres endroits.
namelist est initialisé par Files In Directory ; dtlist est initialisé sur une liste vide. Les noms sont supprimés, un par un, de la liste de noms et ouverts (masqués). Les tables ouvertes sont stockées une par une dans dtlist. (C'est juste un pointeur, ou une poignée, vers la table, pas le contenu de la table.)
Ensuite, s'il y a plus d'un élément dtlist, la concaténation crée une nouvelle table à partir d'eux. (J'étais heureux de constater que la concaténation accepte une liste de tables.) S'il n'y en a qu'une, le sous-ensemble en fait une copie. Faire une copie crée une table non enregistrée, tout comme la concaténation faite, donc les résultats sont similaires dans les deux cas.
Le nettoyage supprime les tables masquées, renomme la table de résultats et supprime le script source du résultat. Vous voudrez peut-être conserver le script source. Cet exemple pourrait également utiliser Supprimer le répertoire à la fin, mais c'est probablement une mauvaise idée de le faire avec de vrais fichiers source.
Voir également
Fichiers dans le répertoire
concaténation-tables-de-données
Très bon extrait pour importer plusieurs fichiers Excel, ce qui est une faiblesse de l'IMF.
A également aidé pour les fichiers de concaténation par force brute qui ont un nombre légèrement différent de colonnes, ce qui n'est pas possible dans MFI.
Vous pouvez également spécifier d'autres options lors de l'utilisation de Open(), ce qui m'a aidé à importer des fichiers Excel avec deux lignes d'en-tête.
While( N Items( filename = Remove From( namelist, 1 /*first item*/ ) ) == 1,
filename = filename[1]; // {dt} -> dt
filename = path || filename; // prepend path name
// inserts opened table at end of dtlist
Insert Into( dtlist, Open( filename, invisible, Worksheets( "MyWorksheet" ),
Use for all sheets( 1 ),
Concatenate Worksheets( 0 ),
Create Concatenation Column( 0 ),
Worksheet Settings(
1,
Has Column Headers( 1 ),
Number of Rows in Headers( 2 ),
Headers Start on Row( 1 ),
Data Starts on Row( 3 ),
Data Starts on Column( 1 ),
Data Ends on Row( 0 ),
Data Ends on Column( 0 ),
Replicated Spanned Rows( 1 ),
Replicated Spanned Headers( 0 ),
Suppress Hidden Rows( 1 ),
Suppress Hidden Columns( 1 ),
Suppress Empty Columns( 1 ),
Treat as Hierarchy( 0 ),
Multiple Series Stack( 0 ),
Import Cell Colors( 0 ),
Limit Column Detect( 0 ),
Column Separator String( "-" )
) ) );
);
Nouvel utilisateur ici et j'ai trouvé cela très utile lorsque j'essaie de consolider les données de plusieurs ensembles multiples. Merci!