Problem
Verketten Sie Datentabellen mithilfe von Dateien im Verzeichnis, ohne den Import mehrerer Dateien zu verwenden
Lösung
Verwenden Sie „Dateien im Verzeichnis“, um eine Liste zu erstellen, und „Verketten“, um sie zusammenzufügen.
// 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 );
Diskussion
JMP 14 führt den Import mehrerer Dateien ein; @wu Ich habe festgestellt, dass einige Tabellenattribute nicht erhalten blieben. (JMP 15 sollte besser abschneiden, ist aber noch nicht verfügbar.)
Im ersten Teil dieses Beispiels werden „DeleteDirectory“ und „CreateDirectory“ verwendet, um einen sauberen Satz Beispieldateien zum Testen zu erstellen. Möglicherweise stellen Sie fest, dass „DeleteDirectory“ fehlschlägt, wenn eine der JMP-Tabellen von einem früheren Versuch noch geöffnet ist. Mit dem Tabellen-Widget können Sie die Tabellen manuell schließen, auch wenn sie ausgeblendet sind
Click the table icon beside the widget to open the hidden tableClick the table icon beside the widget to open the hidden tableKlicken Sie auf das Tabellensymbol neben dem Widget, um die ausgeblendete Tabelle zu öffnen
Derselbe Code fügt 1000 zu den Dateinamen hinzu, damit sie sauber sortiert werden (nicht 1,10,2,3,4,5,6,7,8,9). Die Pfadvariable hat einen abschließenden Schrägstrich, sodass der Schrägstrich nicht an anderen Stellen hinzugefügt werden muss.
Namensliste wird durch Dateien im Verzeichnis initialisiert; dtlist wird mit einer leeren Liste initialisiert. Die Namen werden nacheinander aus der Namensliste entfernt und geöffnet (ausgeblendet). Die geöffneten Tabellen werden einzeln in dtlist gespeichert. (Das ist nur ein Zeiger oder Handle auf die Tabelle, nicht der Inhalt der Tabelle.)
Wenn dann mehr als ein dtlist-Element vorhanden ist, erstellt concatenate daraus eine neue Tabelle. (Ich war froh, dass concatenate eine Liste von Tabellen akzeptiert.) Wenn es nur eine gibt, erstellt subset eine Kopie. Beim Erstellen einer Kopie wird eine nicht gespeicherte Tabelle erstellt, genau wie beim Erstellen einer Verkettung, sodass die Ergebnisse in beiden Fällen ähnlich sind.
Durch die Bereinigung werden die ausgeblendeten Tabellen entfernt, die Ergebnistabelle umbenannt und das Quellskript aus dem Ergebnis entfernt. Möglicherweise möchten Sie das Quellskript behalten. In diesem Beispiel könnte am Ende auch „Verzeichnis löschen“ verwendet werden, aber es ist wahrscheinlich keine gute Idee, dies bei echten Quelldateien zu tun.
Siehe auch
Dateien im Verzeichnis
Datentabellen verketten
Wirklich tolles Snippet zum Importieren mehrerer Excel-Dateien, was eine Schwäche des MFI darstellt.
Hilft auch bei der Brute-Force-Verkettung von Dateien mit einer leicht unterschiedlichen Anzahl von Spalten, was in MFI nicht möglich ist.
Auch bei der Verwendung von Open() kann man weitere Optionen angeben, was mir beim Import von Excel-Dateien mit zwei Kopfzeilen geholfen hat.
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( "-" )
) ) );
);
Als neuer Benutzer hier empfand ich dies als sehr hilfreich, wenn ich versuchte, Daten aus vielen mehreren Sätzen zu konsolidieren. Danke!