丁祥欢
配方文本的解析思路,与YAML格式表达结果
2025-4-29 14:56
阅读:186

最近在学习用C++,顺手把配方文本解析的程序写了一遍,最后的结果输出时,我发现YAML格式是很合适的一个格式(除了EXCEL表格之外)。

说起这个配方文本解析工具,起源于很多年前为了方便样品配制员将文本表达的配方快速计算为按百分比的结果,我用EXCEL的VBA将它写了一遍,使用起来非常方便,一按按钮就能够将文本转化成特定位置上的配方,极大了减少了人工计算时容易出错的现象。 后来我慢慢不用VBA编程了,又用Python将它重新实现了一遍,用Python+xlwings+Excel处理,结果仍然存贮在Excel中, 同样也很方便。

为了锻炼自己的思路,后来我又用Perl把它同样的功能写了一遍,但Perl由于生态不行,也缺乏合适的IDE,虽然用它解析正则表达式很方便,但字串处理/Unicode/数据库配套等方便还是欠缺,使用上还是非常不方便,后来也放弃了。

今年的空闲时间比较多,前段时间我捡起Delphi,尝试用DLL把文本解析的功能重新写了一遍,效果还是不错的。后来为了进一步学习C++,我又用C++把这个工具重新写了一遍。现代C++中有不少很好用的工具,其中容器/正则表达式库(特别是支持命名捕获的xpressive库)等很好用。

说到配方文本的解析上来,我发现,要想减少程序的难度,得先把分解文本的思路理得特别清楚,再来实现就轻松得多。以前版本的思路是根据人家配方的写法不同,设计不同的模式,针对不同的模式去写相应的解析代码,但模式的变化比较多,会导致代码量大,而且重复的代码多。后来我仔细考虑,可以采取逐步剪裁切割的方法,将文本一步步分割成几个部分,针对每个部分解析,再组合最终的结果。这样的方式比较省力,代码也有一定的通用性。

举一个随便编的配方如下:

Sample EC:DMC:DEC=3:1:2, LIPF6: 1.2M, 0.3M LiFSI, VC: 1.5%, PS: 2%, 0.8%LIPF2O2, 1.0kg {Density:1.25;Purpose: Sales; Operator:DXX;Alias:Sale-1}

这个格式中,信息依次是(为方便理解,分段显示)

1) 型号 空格 

2)比例文本 逗号

3)锂盐最终含量与添加剂最终含量表达式 逗号分隔

4)样品重量信息

5)背景信息(各部分为英文分号分隔)

按以上对文本的分析结果,可以用正则表达式将它们提取出来,分别交给五个解析的子类来处理。定义一个结构来存贮结果即可。

第1类中只有型号信息,有的还会在型号中用中括号捎带一个别名,处理起来很简单。

第2类中比例文本有的还分(v/v)或(w/w), 正则表达式区分一下也好处理,然后根据等号将它分割成两个字串,再分别切割成两个数组即可 。但其它成分未确定含量之前,它无法归一化。因此要放到最后来计算。

第3类中稍微复杂一点,锂盐有按摩尔浓度表达的,需要确定转化为百分比的方式。这个各家不一样,但一般都是根据经验系数来转化的。当然,如果提供了溶液的密度,就可以根据分子量和 溶液的密度计算出最终的百分含量。 我的处理方法是计算出锂盐百分含量之后进行文本替换,它与添加剂一样都是百分比形式表达。

当然,百分比表达也有名称在前(如EC:25%)和百分比在前(25% EC)两种表达方法,这时用命名捕获的正则表达式就很方便了,解析之后直接用名字引用得到的含量或名称。

第3类中所有的百分比加起来之后,用100%去减,剩下的就是第2类成分的总含量,因此第2类就很容易分解到各个成分的含量了。这样计算就完成了。

第4类 用正则的命名捕获来解析也很简单。

第5类 将花括号内的内容提取出来之后,再根据分隔符分割成数组,再循环将各个数组分割,处理成map<pair>结构的结构存起来即可。

解析程序的类设计2.png

解析完成之后,如果你手头有一些模型可以用于估算,就可以使用结果来进行计算了。比如电导率回归模型,密度回归模型等。其实我觉得还可以开发一些对电池内阻的影响系数方程,对倍率性能的的系数方程,对循环寿命的益处等类型的模型,或许可以指导配方的设计。

处理完成之后,就可以将存贮的数据转化成一定的格式输出,目标可以是Excel的表格,数据库的记录(如sqlite, access, mysql etc), csv文件(不太建议),Json格式的文本等。这里我比较喜欢的是这种yaml格式的输出,它就象Python一样利用缩进来表达数据的层次,非常直观。

全文2.png

转载本文请联系原作者获取授权,同时请注明本文来自丁祥欢科学网博客。

链接地址:https://wap.sciencenet.cn/blog-1213210-1483907.html?mobile=1

收藏

分享到:

上一篇
下一篇
当前推荐数:0
推荐到博客首页
网友评论0 条评论
确定删除指定的回复吗?
确定删除本博文吗?