Spotfire中Split函数按()()拆分列时如何保留历史内容不被覆盖
问题原因
你当前的写法固定取Split([column name],"()",2)的结果,仅能读取第一组被()包裹的内容:
- 当字段只有
()info 1()时,按()拆分后第2段正好是info 1,符合预期 - 一旦新的
()xxx()标记插入到原有内容前方,原有内容的拆分索引会向后偏移,第2段就会变成新插入的内容,出现“覆盖”的假象 - 就算新标记追加在末尾,固定取第2段的写法也无法读取到后续新增的内容
解决方案
方案1:全量提取拼接为单列(推荐,无内容丢失风险)
用正则全局匹配所有符合()内容()格式的片段,自动按出现顺序提取所有内容拼接,不受标记插入位置影响,计算表达式如下:
Trim( RXReplace( RXReplace([column name], ".*?\\(\\)(.*?)\\(\\)", "、$1", "g"), "^、", "", "" ) )
表达式逻辑说明:
- 内层正则用全局匹配模式,把所有
()内容()片段替换为、提取到的内容 - 外层正则去掉拼接结果开头多余的顿号
- 最后用Trim清除首尾多余空格
测试效果:
- 字段值为
()info 1()时,返回info 1 - 字段值更新为
()info 2()()info 1()(新标记插在最前),返回info 2、info 1 - 字段值更新为
前缀()info 1()中间内容()info 2()后缀()info 3(),返回info 1、info 2、info 3
方案2:多列分别存储各段内容(适合分段分析场景)
如果需要把每段标记内容单独存在独立列,按照Split拆分规律——所有被()包裹的有效内容都在偶数索引位(2、4、6……),提前为后续新增内容预留列即可:
- 第1段内容列:
Trim(Split([column name],"()",2)) - 第2段内容列:
Trim(Split([column name],"()",4)) - 第3段内容列:
Trim(Split([column name],"()",6)) - 第N段内容取索引
2*N即可
注意:该方案仅适用于新标记永远追加在字段末尾、不会插入到已有标记之前的场景,否则会出现内容错位,优先选择方案1。
内容的提问来源于stack exchange,提问作者Beno
相关产品推荐
相关产品推荐

