問題
使用目錄中的文件連接數據表,而不使用多個文件導入
解決方案
使用目錄中的文件創建列表並連接將它們放在一起。
// 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 );
討論
JMP 14 引入多文件導入; @吳注意到它沒有保留一些表屬性。 (JMP 15 應該做得更好,但尚未推出。)
本示例的第一部分使用DeleteDirectory 和CreateDirectory 來創建一組乾淨的示例文件以進行測試。 如果任何 JMP 表在之前的嘗試中仍然打開,您可能會發現 DeleteDirectory 失敗;您可以使用表格小部件手動關閉表格,即使它們是隱藏的
Click the table icon beside the widget to open the hidden tableClick the table icon beside the widget to open the hidden table單擊小部件旁邊的表格圖標可打開隱藏的表格
相同的代碼在文件名中添加 1000 以使它們更好地排序(而不是 1,10,2,3,4,5,6,7,8,9 )。 路徑變量有一個尾部斜杠,因此不必在其他位置添加斜杠。
名單由目錄中的文件初始化; dtlist 被初始化為空列表。 名稱將從名單中一一刪除並打開(隱藏)。 打開的表一一存儲在dtlist中。 (這只是表的指針或句柄,而不是表的內容。)
然後,如果有多個 dtlist 項,則連接會根據它們創建一個新表。 (我很高興發現 concatenate 接受表列表。)如果只有一個,子集會生成一個副本。 製作副本會生成未保存的表,就像製作連接一樣,因此兩種情況下的結果相似。
清理將刪除隱藏表並重命名結果表並從結果中刪除源腳本。 您可能想保留源腳本。 此示例還可以在最後使用“刪除目錄”,但對真正的源文件執行此操作可能是一個壞主意。
也可以看看
目錄中的文件
連接數據表
用於導入多個 Excel 文件的非常好的片段,這是 MFI 的弱點。
還有助於強力連接列數略有不同的文件,這在 MFI 中是不可能的。
您還可以在使用 Open() 時指定更多選項,這幫助我導入具有兩個標題行的 Excel 文件。
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( "-" )
) ) );
);
這裡是新用戶,我發現這在嘗試合併來自多個多個集合的數據時非常有幫助。 謝謝!