年初开始,我爸就时不时遇到手机莫名发烫重启或app突然闪退等问题,让我意识到他手上那部2018年初买的一加5T该退休了。一加简洁的「氢OS」是我之前一直坚持使用一加手机的重要原因,可时至今日,一加终于也向市场妥协,让我决定把我父母的手机也从Android转向iOS。
但我很快发现苹果的转移助手漏掉了一个很重要的数据:备忘录。
我爸最近这两年偶尔会有血压升高的情况,所以他之前会时不时地把自己测量的血压数据记录到手机的备忘录里,前前后后已经产生了近700条不是特别规范的纯文本血压和心率记录。如何把这些数据导入iPhone成了问题。
我首先大致在iOS健康app里摸索了一下,发现这个app并没有提供批量写入数据的功能,只提供了手动添加数据的功能。
简单尝试之后我就明确了方案:先把我爸手动记录的备忘录数据清洗整理成格式统一的文本,发到iPhone上;再用快捷指令功能挨个处理这些文本数据,提取其中的关键信息,写入健康app。
首先要解决的问题就是数据格式不统一。我爸用备忘录记录血压数据没有一个特别规整的格式,以下是几个例子:
20210313星期三11:00142/786420210314星期日晴20℃06:54165/89心率7020210316星期二小雨17℃07:15146/82心率6720210319星期五阴11℃07:25148/82心率6509:58161/79(1)73152/77(2)76可以看到,这些数据除了血压,有时还会记录天气,其中的气温有时在日期的同一行,有时在单独行;数据之间有时会用单个空格分隔,有时会用多个空格;有时一天会连续记录两条;有时会用中文标记「心率」……
这样的数据很难用被批量处理,所以我需要先把所有数据都「清洗」成统一的格式。
数据清洗的方法其实非常多也非常灵活,需要结合数据的特点和自己的能力范围来选择合适的工具和方法。这里,只简单介绍几种最基础的常见手段供大家打开思路。
注意到记录中的日期都是2021或2022开头,所以先选中第一行前面的「202」,然后可以选择如下方法之一:
这样就可以一次性选中文档中所有的「202」。
现在按一下右箭头键,就能在文档中所有2021或2022之后添加一个光标。按钮把光标一起移动到每个日期行中的日期数据后面,然后用Command+Shift+→组合键(将选中区域延伸到行尾),从而批量选中每个日期行中除日期以外的数据。
最后一下按删除键,日期数据就被「清洗」干净了。
接下来,我们用查找替换的功能删除数据中与心率无关的信息。
首先是一个简单的纯文本查找:要删掉所有的「心率」字样,直接用Command+F打开搜索替换面板,搜索「心率」并批量替换为空即可。
接下来删除气温数据。由于涉及变量,需要使用正则表达式。为此,点击搜索框最右侧的按钮,启用正则表达式匹配。
这里用到的正则表达式是:
[0-9]{2}℃\n它的意思是,连续两个数字,后接一个摄氏度符号℃,后接一个换行。
将其替换为空,就去掉了所有单成一行的气温数据。
再来删除用来标记多次记录的数字编号(1)、(2)等。用到的正则表达式是:([0-9]),同样替换为空。
最后去掉多余的空格。这里既可以用普通搜索,将两个空格替换为一个空格,多次操作直到不再有连续空格;也可以用正则表达式\s{2,},搜索两个或以上的连续空格,替换为一个空格。
经过上面一系列操作,数据就变成了下面这样,明显更加清爽:
2021031311:00142/78642021031406:54165/89702021031607:15146/82672021031907:25148/826509:58161/7973152/7776统一记录格式:使用JavaScript能不能再整洁一点呢?我想将格式统一成「YYYYMMDDHH:MM/高压/低压/心率」这样的格式。为此,一点点在编辑器中查找替换当然也可以,但要想一步到位,就得写一点简单的程序了。
以Chrome或Edge浏览器为例:随便打开一个新标签页,按F12键就打开开发者工具,然后这时切换到「控制台」选项卡。
现在,把我们刚刚处理了一半的数据赋给上面代码中的data变量,即粘贴到代码第一行的一对反引号``内部,然后将代码整体粘贴到控制台中:
按下回车键,就可以看到程序输出的结果了:
选中程序输出的数据,保存为文本文件,发送到iPhone上。
至于如何传输,方法很多:
这一节,我简要的介绍了多选、查找替换、正则表达式匹配、JavaScript脚本这几种数据清洗方法。其中正则表达式和JavaScript编程可能会有一些门槛,但这也不是必须的,你完全可以使用你自己熟悉的各种方法来清洗数据。比如,如果你熟练掌握Excel,上面那些数据处理步骤用Excel也能完成。
清洗和传输数据后,终于到了激动人心的快捷指令编排环节。
2022051505:55/148/79/582022051505:58/136/76/582022051513:16/137/72/68根据这个数据结构,快捷指令的逻辑就是:
其中第三步的处理过程又分为这几个步骤:
逻辑梳理清楚了就开干啦,首先把最外层的框架编排出来。遵循循序渐进的原则,比较复杂的第三步暂时不做,用一个「显示通知」占位,顺便测试效果。
这时复制三条数据测试一下:
可以看到,执行快捷指令之后,会连续弹出三条通知把刚刚复制的数据内容显示出来,说明快捷指令的外层循环框架已经完成了。
接下来就是编排第三步里面的逻辑。将之前用来占位的通知步骤替换为红框中的部分:
经过测试,弹出的通知能按照给定格式显示数据,说明我们的数据拆分逻辑是正确可行的。
接下来就是把这些数据写入健康app了。将上一步中的显示通知步骤替换为下图中的步骤:
这里,我们提取之前步骤获得的各项信息,填写到「记录健康样本」步骤的各个栏位中。
好了,一切就绪,让我们先用几条测试数据来看看效果:
可以看到,三条数据在执行快捷指令后立刻就被写入了健康app。在健康app中查看时,显示的图标也说明这些数据是由快捷指令写入的。
数据和脚本都准备好了,就可以正式开始导入数据了。
首先把电脑上准备好的文本数据文件发到手机上,并保存到「文件」app中。长按这个文件,点选「快速查看」,然后长按并拖动选区,直到将整个文件的所有内容都选中后,点击复制,这样文件内容就都保存到剪贴板中了。
现在来到快捷指令app中,点击运行我们刚刚编写好的快捷指令。如果你的数据量比较多,可能需要多等一会;快捷指令的右上角此时会显示一个进度圆环:
比如我一次导入了将近700条数据,在这个状态大概等了差不多1分钟,等到右上角按钮变成对勾的时候,数据就导入完成啦。