Problema
Concatena le tabelle di dati utilizzando i file nella directory, senza utilizzare l'importazione di più file
Soluzione
Usa File nella directory per creare un elenco e Concatena per metterli insieme.
// 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 );
Discussione
JMP 14 introduce l'importazione di più file; @wu notato che non conservava alcuni attributi della tabella. (JMP 15 dovrebbe funzionare meglio, ma non è ancora disponibile.)
La prima parte di questo esempio utilizza DeleteDirectory e CreateDirectory per creare un insieme pulito di file di esempio per il test. Potresti scoprire che DeleteDirectory non riesce se una qualsiasi delle tabelle JMP è ancora aperta da un tentativo precedente; puoi chiudere le tabelle manualmente, anche se sono nascoste, utilizzando il widget delle tabelle
Click the table icon beside the widget to open the hidden tableClick the table icon beside the widget to open the hidden tableFare clic sull'icona della tabella accanto al widget per aprire la tabella nascosta
Lo stesso codice aggiunge 1000 ai nomi dei file per ordinarli correttamente (non 1,10,2,3,4,5,6,7,8,9). La variabile percorso ha una barra finale in modo che la barra non debba essere aggiunta in altri punti.
namelist è inizializzato da Files In Directory; dtlist è inizializzato su un elenco vuoto. I nomi vengono rimossi, uno ad uno, dalla lista dei nomi e aperti (nascosti). Le tabelle aperte vengono memorizzate una per una in dtlist. (Questo è solo un puntatore, o maniglia, alla tabella, non il contenuto della tabella.)
Quindi, se c'è più di un elemento dtlist, concatenate ne crea una nuova tabella. (Sono stato felice di scoprire che concatenate accetta un elenco di tabelle.) Se ce n'è solo uno, subset crea una copia. La creazione di una copia crea una tabella non salvata, proprio come il concatenamento, quindi i risultati sono simili in entrambi i casi.
Pulisci rimuove le tabelle nascoste e rinomina la tabella dei risultati e rimuove lo script di origine dal risultato. Potresti voler mantenere lo script sorgente. Questo esempio potrebbe anche utilizzare Elimina directory alla fine, ma probabilmente è una cattiva idea farlo su file sorgente reali.
Guarda anche
File nella directory
concatenare-data-tables
Snippet davvero eccezionale per l'importazione di più file Excel, che è un punto debole dell'MFI.
Ha anche aiutato per la concatenazione di file con forza bruta che hanno un numero di colonne leggermente diverso, cosa non possibile in MFI.
Puoi anche specificare ulteriori opzioni quando usi Open(), che mi ha aiutato a importare file Excel con due righe di intestazione.
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( "-" )
) ) );
);
Nuovo utente qui e ho trovato questo molto utile quando si cerca di consolidare i dati da molti set multipli. Grazie!