Problema
Concatenar tablas de datos usando archivos en el directorio, sin usar la importación de archivos múltiples
Solución
Use Archivos en Directorio para hacer una lista y Concatenar para juntarlos.
// 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 );
Discusión
JMP 14 introduce la importación de múltiples archivos; @wu notó que no conservaba algunos atributos de la tabla. (JMP 15 debería funcionar mejor, pero aún no está disponible).
La primera parte de este ejemplo utiliza DeleteDirectory y CreateDirectory para crear un conjunto limpio de archivos de muestra para realizar pruebas. Es posible que descubra que DeleteDirectory falla si alguna de las tablas JMP todavía está abierta desde un intento anterior; puede cerrar las tablas manualmente, incluso si están ocultas, usando el widget de tabla
Click the table icon beside the widget to open the hidden tableClick the table icon beside the widget to open the hidden tableHaga clic en el ícono de la tabla al lado del widget para abrir la tabla oculta
Ese mismo código agrega 1000 a los nombres de los archivos para que se clasifiquen bien (no 1,10,2,3,4,5,6,7,8,9). La variable de ruta tiene una barra diagonal final, por lo que no es necesario agregar la barra diagonal en otros lugares.
la lista de nombres se inicializa mediante Archivos en directorio; dtlist se inicializa en una lista vacía. Los nombres se eliminan, uno por uno, de la lista de nombres y se abren (ocultos). Las tablas abiertas se almacenan una por una en dtlist. (Eso es solo un puntero, o identificador, a la tabla, no el contenido de la tabla).
Luego, si hay más de un elemento dtlist, concatenar crea una nueva tabla a partir de ellos. (Me alegró encontrar que concatenar acepta una lista de tablas). Si solo hay una, el subconjunto hace una copia. Al hacer una copia, se crea una tabla sin guardar, al igual que concatenar, por lo que los resultados son similares en ambos casos.
La limpieza elimina las tablas ocultas, cambia el nombre de la tabla de resultados y elimina el script de origen del resultado. Es posible que desee conservar el script de origen. Este ejemplo también podría usar Delete Directory al final, pero probablemente sea una mala idea hacerlo con archivos de origen reales.
Ver también
Archivos en directorio
concatenar tablas de datos
Fragmento realmente genial para importar múltiples archivos de Excel, lo cual es una debilidad de la IMF.
También ayudó para la concatenación de archivos de fuerza bruta que tienen un número ligeramente diferente de columnas, lo que no es posible en MFI.
También puede especificar más opciones al usar Open(), lo que me ayudó a importar archivos de Excel con dos líneas de encabezado.
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( "-" )
) ) );
);
Nuevo usuario aquí y encontré que esto es muy útil cuando intento consolidar datos de muchos conjuntos múltiples. ¡Gracias!