【问题标题】:How can I merge 2 spotfire tables by a regex match?如何通过正则表达式匹配合并 2 个 spotfire 表?
【发布时间】:2017-07-03 16:24:32
【问题描述】:

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

现在我通过一个带有计算列的大型嵌套 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

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

谢谢。

【问题讨论】:

    标签: spotfire


    【解决方案1】:

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

    最终输出:

    希望这会有所帮助!

    【讨论】:

    • 嗯,谢谢你的建议。不幸的是,我的示例并未涵盖所有情况,因此这行不通。我需要的一些家庭包括数字,这会破坏这一点,除其他外。问题是我不控制名称字段中项目的命名约定,但为了分析的目的,我需要将它们分成几类。那么,我将尝试使用 IronPython 来完成此任务。
    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-12-09
      • 2018-09-06
      • 1970-01-01
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多