(已解决) 关于函数 htmlparse、xml 和 json@v

大佬们,周末好🙏 🙏

附件中的 json 文档是从某会计软件中下载的一个序时账记录,部分内容如下所示:

imagepng

观察截图中的灰色阴影部分,可以发现有 4 行是带 p 标签的,且在带有数值的最后两行中,有些成对的 p 标签之间没有值是 null。最终要求是把该文档转换成一个会计上的序时账格式,如下所示:

imagepng

不难发现,那些带 p 标签的 4 行分别对应上图中业务描述、科目代码和会计分录、借方金额、贷方金额这四列。特别地,在借方金额和贷方金额这两列中,数值之间是用 null 错位排列的。也就是说像这种没有值的 p 标签 "<p></p>" 是有用处的。

解析这部分 p 标签,我能想到的有两种方法,随便取一个作为举例:

<p>1,401.00</p><p></p><p>1,401.00</p><p>1,401.00</p><p></p>

1、xml 方法。但 "<p></p>“这种不是标准的 xml 格式,需在首尾人为添上一组标签, 比如”<a>“和”</a>",之后再用 xml 解析得到结果如下所示:

imagepng

可以看到,用 xml 方法解析得到了所有 p 标签的值,包括 null 值,很明显这样的结果符合要求,因为 null 值是用来错位排列的。

2、htmlparse 方法。想着 xml 方法略显繁琐,因为要人为添加字符串,所以想着用 htmlparse 方法会简短一些,但结果跟预期的有点出入:

imagepng

在代码格 A5 中可以看到,用 htmlparse 之后,结果把 null 值全都忽略了。在当前需求中,这样是不符合要求的。去掉 null 容易,想要后续再补上 null 就会比较难,因为还有位置的问题。

所以,我想求助的问题如下:

1、htmlparse 解析后,可不可以保留这些 null 值,有多少对标签就解析出对少个对应的值。或者可不可以有个选项让用户自己决定是否保留这些 null。因为去掉 null 容易,想要后续再补上 null 就会比较难,补在哪里是个问题。

2、htmlparse 的 1 参是 tag 值,省略表示返回所有文本值,这个功能肯定好的很,那可不可以指定标签值就返回所有该标签的值,比如 xxx.htmlparse(“p”) 返回所有 p 标签的值,目前直接这样写是不允许的,必须指明是第几个,xxx.htmlparse(“p”:0) 表示第一个 p 标签的值,这样写能返回结果。在微软的 Power Query 中有类似的用法 Html.Table,如下所示:

imagepng

我倒不是说 PQ 有多高明,只是在 Html.Table 里还能支持 CSS,实际上 PQ 在处理清洗这种问题时,效率也不如人意,我测试了把附件文档放大 1 万倍 (大概 18 万行 10 列),PQ 转换格式后加载到表格前后将近 90 秒,而 SPL 只需要 20 秒,如果用并行的话,可以跑进 7 秒左右。

3、解析后,文本数值可不可以返回真正的数值,这点目前 xml 可以解析成数值 (只要不含千位分隔符),而 htmlparse 不会把文本数值解析成数值。SPL 中有些函数是有这样的转换选项的,比如,split@p、property@v。那 htmlparse 是否也能实现类似的转换?特别地,对这种有千位分隔符的文本数值,xml 或者 htmlparse 能不能直接解析成数值?

以上 3 个想法,第 1 个我还是比较笃定的,有多少对标签就对应多少个值,删总比补要容易。其它两个想法我也不是很确定,因为我不专业,完全凭个人喜好。但在使用过程中多少会有点磕绊和变扭,如果有相应的功能,那写起来自然会很流畅。

4、另外发现一个 json@v 的问题,用了 v 选项后,发现字段都带上了双引号,如下所示:

imagepng

这样是正常的吗?不用 @v 选项时,字段是不会带双引号的:

imagepng

恳请大佬们得闲时帮忙看看,万分感谢🙏 🙏

最后附上 SPL 测试语句和 json 文件:

A
1 =file("journal.json":"UTF-8").read()
2 =json(A1).(cell)
3 =A2(4)(6)
4 =xml("< a>"/A3/"< /a>","a/p")
5 =A3.htmlparse()

EXCEL 中的语句如下:

=spl("=json(file($[journal.json]:$[UTF-8]).read()).(cell)
=A1.@m(E@2p(~.conj(if(pos(~,$[<p>]),E@2p(xml($[<a>]/~/$[</a>],$[a/p]).(~.split("" ""))),[[~]])))).conj()")

imagepng

json 文档附件:
journaljsonzip