<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />在我的以前的在博客文章中,我描述了如何将 BodyMedia® 活动摘要数据文件从 Excel 导入到 JMP 中。 今天,我将分享如何将近四年的 BodyMedia® 饮食日志自动导入 JMP。 我还上传了一个加入到 JMP 文件交换,您可以使用它导入您自己的活动摘要和食物日志文件,以及来自流行的免费 MyFitnessPal 食物记录网站的 CSV 格式的食物日志文件。
为了我的海报项目(请参阅下面的详细信息),我创建了 JSL 脚本来组合、解析和格式化从 BodyMedia® 软件导出的近 50 个活动摘要 Excel 文件和 50 个食物日志文件,涵盖从 2010 年 12 月 20 日到 2014 年 7 月 28 日的时间段。 我从 BodyMedia® 基于网络的活动监视器软件以 PDF 格式导出了我的食物日志文件。
当我第一次开始处理食物日志文件时,我意识到我无法直接处理它们,因为 JMP 不支持从 PDF 格式导入。 接下来的经历让我更好地理解了为什么会出现这种情况。 我听说客户建议 JMP 应添加对 PDF 导入的支持,而 JMP 开发人员回应称,PDF 中的表格用于演示目的,通常不像 JMP 支持的其他文件类型那样以常规格式组织。 我用自己的文件亲身经历了这一点!
最初,我认为我可以将 PDF 食物日志文件转换为 Excel 格式,并使用与我以前使用的方法类似的方法导入它们导入我的活动摘要文件。 虽然我尝试了各种承诺可以轻松将 PDF 转换为 Excel 的软件产品,但我只能将整个体验描述为一次史诗般的失败。 我发现转换后的表格的结构从一页到另一页都非常不规则。 在花了一个小时手动将单个 Excel 文件编辑为更常规的格式后,我放弃了。 我无法想象在这个极其无聊的任务上多花一分钟时间,而且当时我有 40 个文件需要处理! 我不愿意等到 2017 年 Discovery Summit 才导入数据,所以我决定寻找一种更简单、更快的途径。
我发现可以使用 Adobe Acrobat 将 PDF 文件另存为文本文件。 不幸的是,这些文件包含不同长度的以空格分隔的项目名称,后面是代表卡路里、份量和常量营养素含量的以空格分隔的数字。 JMP 中的点击式文本导入选项需要固定长度或字段之间的分隔符,因此这两个选项都无法从我的文件中生成可供分析的数据表。 我决定使用与我为导入活动摘要 Excel 文件而编写的循环结构类似的循环来导入和组合我的文件。 (如果您阅读了我之前的文章,您就会知道我大量借用了来自SESUG纸写于迈克尔·赫克特。
导入并连接文件后,我可以使用 JSL 中的正则表达式从每行文本中解析出单独的信息。 起初我对这条路有些忐忑。 虽然在研究生的时候就用过 Perl 来做正则表达式,但是我的正则表达式技能很生疏,而且之前也没有在 JSL 中使用过正则表达式。 我拜访了 JMP 开发人员 Craige Hales,他在 JMP 中实现了正则表达式引擎,他提供了很多鼓励并提供了一些有用的示例。
为了格式化表格以供进一步分析,我需要循环表格中的所有行并匹配与日期、膳食名称、卡路里含量和各种常量营养素类型的克数相对应的模式。 我使用如下循环来解析我需要的数据,并将每条信息放入其自己的列中。 下面,我检查了餐食名称,并从它出现的位置(每天的第一行)捕获了它。 然后,我用该餐食名称值填充餐食列的单元格,直到遇到新的匹配项,指示下一餐的项目开始。
//捕捉食物
对于 (c=1, c <= y, c++,
string = 组合日志:生活方式和卡路里管理系统;
//检查餐食名称是否匹配
w = ( 正则表达式匹配 (
细绳,
Pat Regex("^(早餐|上午小吃|午餐|下午小吃|晚餐|晚点小吃) (.*$)")));
如果(N 项(w)== 0,
综合日志:膳食= 膳食;
继续 ());
组合日志:生活方式和卡路里管理系统= w[3];
综合日志:膳食= w[2];
餐=w[2];
);
我使用上面显示的通用正则表达式匹配策略提取了所需的所有信息。 运行脚本的最终版本后,我得到了一个格式良好的表格,其中包含 34,432 行食品名称以及按日期和膳食组织的相关卡路里和大量营养素信息。
如果您有以 PDF 格式保存的 BodyMedia 食物日志文件,您可以将它们保存为 Adobe Acrobat 中的文本文件并下载我的加入从 JMP 文件交换执行点击式导入操作,将您自己的食物日志文件导入到 JMP 中。 此插件中的工具支持活动摘要文件、另存为文本的食物日志文件以及从 MyFitnessPal 导出的食物日志文本文件。 特别感谢 JMP 测试经理 Audrey Shull 和测试员 Melanie Drake 提供的脚本建议和插件测试帮助!
不幸的是,我从成功导入中感受到的胜利感是短暂的。 对我的表格进行快速总结后发现,它包含超过 1,800 个独特的食品名称! 我开始意识到我对这个数据表的工作才刚刚开始。 我的食物日志充满了命名不一致的地方,因为多年来我从食物数据库中选择了各种名称不同但高度相似的项目。 如果我想开始理解食物日志数据中的模式,我将不得不清理我的食物名称并以更有意义的方式对它们进行分组。 请继续关注本博客系列的第四部分,了解更多关于我在食品名称重新编码方面的冒险经历。
看看最近这个博客文章详细了解我对量化自我 (QS) 分析项目的兴趣如何促使我创建了 2014 年探索峰会电子海报,标题为使用 JMP 分析个人饮食和健身数据。” 如果您在卡里的会议上无法看到我的电子海报,您可以登录并查看PDF版本JMP 用户社区的 Discovery Summit 2014 部分。