OpenRefine 自定义文本分面

OpenRefine custom text faceting

我有一列姓名,例如:

我想用 openrefine 创建一个自定义文本分面,用一个逗号标记为 "true" 名称,所有其他逗号标记为 "false",这样我就可以使用最后一个 (".E ., Calvin F。”这不是问题,我稍后会处理)。

我正在尝试使用 "Custom text facet" 和这个表达式:

if(value.match(/([^,]+),([^,]+)/), "true", "false")

但是结果都是假的。哪里错了?

我会使用先行断言来检查是否只有 1 个“,”可以从行首到行尾找到。

^(?=[^\,]+,[^\,]+$).* https://regex101.com/r/iG4hX6/2

您可以使用 'split' 代替使用 'match' 将字符串拆分为一个数组,使用逗号作为拆分字符。如果您测量结果数组的长度,它将为您提供字符串中逗号的数量(即逗号数量 = length-1)。

因此您的自定义文本分面表达式变为:

value.split(",").length()==2

这会给你 true/false

如果您想根据出现的逗号数分解数据,您可以省略“==2”以获得仅给出结果数组长度的分面。

您使用的表达方式:

if(value.match(/([^,]+),([^,]+)/), "true", "false")

的计算结果始终为 false,因为 'match' 函数的输出要么是一个数组,要么是 null。当由 'if' 计算时,数组和 'null' 都不计算为真。

您可以将匹配函数包装在 'isNonBlank' 或类似函数中以获得布尔值 true/false,这将导致 'if' 函数按您的意愿工作。但是,一旦得到布尔值 true/false 结果,'if' 就变得多余了,因为它的唯一功能是将布尔值 true/false 转换为字符串 "true" 或 "false" -不会对自定义文本方面的值函数产生任何影响。

所以:

isNonBlank(value.match(/([^,]+),([^,]+)/))

应该使用 match

给你想要的结果