问题
使用目录中的文件连接数据表,而不使用多个文件导入
解决方案
使用目录中的文件创建列表并连接将它们放在一起。
// 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( "-" )
) ) );
);
这里是新用户,我发现这在尝试合并来自多个多个集合的数据时非常有帮助。 谢谢!