我正在开发一个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
如果您有任何建议,我将不胜感激。
感谢。
答案 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]))
最终输出:
希望这有帮助!
答案 1 :(得分:0)
正如@ ksp585所提到的,看起来Spotfire并不能完全符合我的要求,所以我想出了一个使用IronPython的解决方案。基本上,这就是我所做的:
创建了一个名为FAMILIES的表,其中包含IDString和Family列,如下所示(使用上面相同的示例字符串):
IDString | Family
------------------------
ABC | ABC
SUP | Super
QRST | QRST
创建了一个名为NAMES的表,作为主数据表的一个转轴,唯一的列是NAME。这只是创建一个唯一名称列表(因为数据表的每个名称都有很多行):
NAME
------------------------
ABC1234
ABC1215
AQRST31x2af
BQRST32x2ac
...
使用标记为Match Families的按钮创建一个文本区域,该按钮调用IronPython脚本。该脚本读取NAMES表,FAMILIES表将每个名称与IDString列与正则表达式进行比较,并将每个名称与结果中的一个族相关联。任何与单个IDString不匹配的名称都会获得姓氏“其他”。然后,它会生成一个名为NAME_FAMILY_MAP的新表,其中包含NAME和FAMILY列。
然后我可以使用另一个脚本将系列添加到FAMILIES表,或者只使用更新的列表替换FAMILIES表。它比我希望的稍微繁琐,但它有效,所以我很高兴。