首页 > 解决方案 > 如何从存在多个满足条件的整体之间的字符串中提取文本并返回所有值

问题描述

这是字符串的一个例子,它可以更长

1160752 Meranji Oil Sats -Mt(MA) (000600007056 0001),PE:Toolachee Gas Sats -Mt(MA) (000600007070 0003)GL:合同服务 (510000),COT:网络 (N),CO:OM-A00009.0723 ,Oil Sats -Mt(MA) (000600007053 0003)

结果需要是 column1 600007056 column2 600007070 column3 600007053 我在 Spotfire 中工作并通过转换创建计算列,因为我需要将列连接到其他数据集

我已经尝试了以下方法,但它只选择了第 600 个 .. 数字而不是其他数字,并且可能有未定义的数量。

帐户是带有字符串的列

Mid([Account],
    Find("(000",[Account]) + Len("(000"),
    Find("0001)",[Account]) - Find("(000",[Account]) - Len("(000"))

谢谢!

标签: spotfirespotfire-analyst

解决方案


假设我的猜测是正确的,并且要查找的模式是:9 个数字,以 6 开头,前面是 1 个左括号和 3 个零,然后是一个空格、4 个数字和一个右括号

您可以通过以下方式获取个别事件:

column1: RXExtract([Amount],'(?<=\\(000)6\\d{8}(?=\\s\\d{4}\\))',1)

column2: RXExtract([数量],'(?<=\\(000)6\\d{8}(?=\\s\\d{4}\\))',2)

等等

棘手的一点是要找到要定义的列数,正如您所说的那样可以有很多。知道的一种方法是首先计算最大出现次数,如下所示:

maxn: Max((Len([Amount]) - Len(RXReplace([Amount],'(?<=\\(000)6\\d{8}(?=\\s\\d{4}\ \))','','g'))) / 9)

仍然假设要提取的每列中的位数为 9。这会将原始 [Amount] 的长度与用空字符串替换的提取模式的长度进行比较,除以 9。

然后您知道您最多可以定义 maxn 列,具有较少实例的行的额外列将是空的。

请注意,Spotfire 总是需要两个反斜杠来转义(我必须在编辑器中添加更多内容以使其正确渲染,我希望我没有错过任何内容)。


推荐阅读