如何通过正则表达式匹配合并2个spotfire表?

时间:2017-07-03 16:24:32

标签: spotfire

我正在开发一个spotfire工具,我在主数据表中使用计算列将数据行分组到' family'通过正则表达式匹配。例如,一行可能有一个'名称' ABC1234xyz,因此它将成为ABC家族的一部分,因为它包含字符串' ABC'。另一行可能类似于AQRST31x2af,属于QRST系列。重点是'家庭'是通过匹配名称中的子字符串来决定的,但该子字符串可以是任意长度,并且不一定是名称字符串的开头。

现在我通过带有计算列的大型嵌套If语句来执行此操作。然而,这对于添加新家庭和维护当前的家庭列表来说是乏味的。我想要做的是创建一个包含2列的表,字符串匹配和系列名称。然后,我想从这个表匹配来确定系列而不是嵌套的if。所以,它可能如下表所示:

Match Table:

id_string | family
----------------------
ABC       | ABC
QRST      | QRST
SUP       | Super

Main Data Table:

name        | data        | family
---------------------------------------
ABC1234     | 1.02342     | ABC
ABC1215     | 1.23749     | ABC
AQRST31x2af | 1.04231     | QRST
BQRST32x2ac | 1.12312     | QRST
1903xSUP    | 1.51231     | Super
1204xSUP    | 1.68123     | Super

如果您有任何建议,我将不胜感激。

感谢。

2 个答案:

答案 0 :(得分:0)

@ wcase6-据我所知,您无法根据表达式将列从一个表添加到另一个表。添加列时,一个匹配列中的值应与另一列完全匹配。

相反,您可以在“主要数据表”上尝试以下解决方案。

注意:此解决方案基于发布的方案。如果有更多/不同的场景,您可能需要调整提供的自定义表达式。

步骤1:添加计算列'ID_string',忽略小写字母和数字。

Trim(RXReplace([Name],"[a-z0-9]","","g"))

第2步:添加计算列'family'。

If([ID_string]="SUP","Super",If(Len([ID_string])>3,right([ID_string],4),[ID_string]))

最终输出:

enter image description here

希望这有帮助!

答案 1 :(得分:0)

正如@ ksp585所提到的,看起来Spotfire并不能完全符合我的要求,所以我想出了一个使用IronPython的解决方案。基本上,这就是我所做的:

  1. 创建了一个名为FAMILIES的表,其中包含IDString和Family列,如下所示(使用上面相同的示例字符串):

    IDString  | Family
    ------------------------
    ABC       | ABC
    SUP       | Super
    QRST      | QRST
    
  2. 创建了一个名为NAMES的表,作为主数据表的一个转轴,唯一的列是NAME。这只是创建一个唯一名称列表(因为数据表的每个名称都有很多行):

    NAME
    ------------------------
    ABC1234
    ABC1215
    AQRST31x2af
    BQRST32x2ac
    ...
    
  3. 使用标记为Match Families的按钮创建一个文本区域,该按钮调用IronPython脚本。该脚本读取NAMES表,FAMILIES表将每个名称与IDString列与正则表达式进行比较,并将每个名称与结果中的一个族相关联。任何与单个IDString不匹配的名称都会获得姓氏“其他”。然后,它会生成一个名为NAME_FAMILY_MAP的新表,其中包含NAME和FAMILY列。

  4. 使用这个新表,然后我可以使用NAME_FAMILY_MAP的左外连接将一个列添加回原始数据表,并在NAME上进行匹配。因为NAME_FAMILY_MAP没有直接链接到NAMES表(按下按钮生成),所以它不会创建循环依赖。
  5. 然后我可以使用另一个脚本将系列添加到FAMILIES表,或者只使用更新的列表替换FAMILIES表。它比我希望的稍微繁琐,但它有效,所以我很高兴。