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

How can I merge 2 spotfire tables by a regex match?

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

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

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

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

谢谢。

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

相反,您可以在 'Main Data Table'.

上尝试以下解决方案

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

第 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]))

最终输出:

希望对您有所帮助!

正如@ksp585 所提到的,Spotfire 似乎不能完全满足我的要求,因此我想出了一个使用 IronPython 的解决方案。基本上,这是我所做的:

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

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

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

  4. 有了这个新的 table,我可以使用来自 NAME_FAMILY_MAP 的左外连接将一列添加回原始数据 table,匹配 NAME。因为 NAME_FAMILY_MAP 没有直接链接到 NAMES table(通过按下按钮生成),它不会创建循环依赖。

然后我可以使用另一个脚本将家庭添加到 FAMILIES table,或者只用更新的列表替换 FAMILIES table。它比我希望的稍微乏味,但它有效,所以我很高兴。