在我之前的博文中JMP 和 Excel - 一个永无止境的故事? - 第1部分最后我举了一个导入带有分层标题和合并单元格的电子表格的示例。 这次我重点关注导入包含许多工作表的电子表格文件以及将多个电子表格(位于特定文件夹中)读取到 JMP 中。 我不想让它变得过于复杂,因此我假设电子表格中以及不同工作表中的结构和参数名称是相同的!
(注意:如果不相同,您必须指定每个工作簿的设置并将它们作为单独的表导入。 随后可以通过使用联接/串联功能或 JMP 数据表的 JMP 查询生成器来将它们组合起来。 如果您想自动化这些类型的步骤,通常需要进一步编写脚本来检查您想要读入的每个变量、工作表和/或文件的角色。
多个工作表 - 导入和自动化
那么我们先看一下Excel中的数据:

人们可以看到不同的工作簿,它们都具有相同的形状和不平凡的结构。 红色下划线可以看到每个工作簿上不同的批号。 我想读入数据,但不想读入单独的表中。 相反,我希望拥有一个表,并使用 JMP 的 Excel 导入向导,这很容易实现:
- 将 Excel 工作表拖到任意 JMP 窗口中将打开 Excel 导入向导:

- 根据需要更改标题和数据字段的设置。 我们有一个不想包含在数据中的标题,实际标题从第 4 行开始,跨越三行。 然后有一行空白字段。 因此,我们在一行后开始数据(8 而不是 7)。 第一列没有用于分析的数据,这就是我们跳过它的原因。

- 单击“下一步”按钮,我们可以使用最后一行设置,告诉我们不想包含时间戳信息。 选择数据结束的行并按加号 (+),您不必关心哪个行号是正确的。

- 剩下的事情是在所有工作表中使用相同的结构。 我们可以检查“用于所有工作表”以及“连接工作表并尝试匹配列”标记。 这会将预览从 30/30 行更改为 90/90 行。 考虑到三个工作表中的每一个都提供 30 行,这似乎按预期工作。 连接时,强烈建议同时选中“连接时使用工作表名称创建列”标志。 否则以后将很难反映数据的来源。
- 最后一步是导入,当然要始终检查导入的数据
如果你想看看它的实际效果,我可以推荐这个短视频(使用 JMP 12)。 如果您刚刚开始使用导入向导,请注意:它将保存最后的设置,这可能会在导入新的但不同的数据时导致令人惊讶的数据视图。 使用“恢复默认设置”按钮,您可以在向导中重置设置。
在每个导入的数据表中,您将找到一个源脚本,用于使用您之前选择的设置重做导入。 这允许读取更新的数据表,以防您在电子表格中获得新的批次数据。 嗯,当经常收集数据时,我可能会考虑使用数据库而不是电子表格,但这是一个不同的故事。
自动导入多个电子表格 - 不同的挑战
现在您知道如何将一个包含多个具有相同结构的工作表的电子表格读取到 JMP 中。 然而,您可能还面临着这样的挑战:“如何将具有相同结构的多个电子表格读取到 JMP 中,而无需对每个文件手动执行此操作,即自动执行此操作。 简短的回答是,使用 JMP 脚本语言。 使用源脚本作为基础,您可以为每个电子表格重新运行此脚本,也可以使用 for 循环遍历文件夹中的所有文件。 您可以使用社区文件交换中共享的一个脚本(也许需要进行一些调整),它正是执行以下操作:合并多个 txt 或 csv 文件
简而言之,您执行以下步骤(仅显示脚本的一部分):
- 选择目录并过滤 Excel 文件
prefilepath = munger(Pick Directory( "Browse to the Directory of the Target Excel Files " ),1,"/","");
filepath = Convert File Path( prefilepath, Windows );
prefilelist = Files In Directory( filepath );
n2=nitems(prefilelist);
//filter out any non-Excel files
For( i2 = 1, n2 >= i2, i2++,
file=(prefilelist[i2]);
If( Item( 2, prefilelist[i2], "." ) == "xls" | Item( 2, prefilelist[i2], "." ) == "xlsx",
Insert Into( filelist,file),
//show(file)
)
);
- 循环遍历文件并导入它们。 为了节省内存,只需打开两个表并用新表更新第一个导入的表,关闭后者并打开下一个。 否则,您可能会在 Windows 上遇到问题,因为使用的窗口句柄数量以及内存(在电子表格很多或非常大的情况下)。
n=nitems(filelist); //number of items in the working list
cctable= New Table( "Combined data table");//make an empty table
ExcelSheetName = "Sheet1"; // change this if you have a special sheet name you want to read the data from
//Iterate through building the SQL string to query the Excel files
For( i = 1, i < n+1, i++,
filenow = ( filelist[i] );
fileopen=(filepath||filenow);
dt=open(fileopen, Worksheets( ExcelSheetName ) );
dt << New Column( "File Name", formula( filenow ) );
cctable << Concatenate( Data Table( dt ), Append to first table );
Close( dt, NoSave );
);//end of for loop
到目前为止,您已经了解了导入简单结构化数据的几种方法,以及如何使用 JMP 中的 Excel 导入向导处理分层和/或合并数据集。 最后,我向您展示了一次导入多个工作表的方法以及如何使用 JSL 脚本自动读取多个 Excel 工作表。 在我的下一篇文章中,我将讨论基于数据格式和其他格式的潜在挑战。
我期待您的评论和分享经验。