OpenRefine文本转换unique()忽略大小写

时间:2016-10-19 14:00:27

标签: jython openrefine grel

有没有办法告诉uniques()忽略大小写?

我有一个像

一样运行的GREL
forEach(value.split(","),v,v.trim()).uniques().join(",")

这将以逗号分隔的单元格中的每个值,然后在该单元格中吐出唯一值。如果我有一个包含的单元格,那么效果很好 保罗,保罗,它将返回两个而不仅仅是保罗'

是否可以将所有值暂时转换为大写以进行比较,然后返回您唯一的第一个拼写?

或许我应该用Python / Jython做到这一点?

2 个答案:

答案 0 :(得分:1)

检查我理解问题 - 例如,如果您从:

开始

保罗,PAUL,爱德华,爱德华

我是否正确地假设您想要最终:

保罗,爱德华

假设我已经理解了这一点,那么我认为我采用的方法是创建忽略大小写的唯一值,然后回顾原始值并提取与特定键匹配的第一个值。

类似于: 使用“编辑列 - >基于此列添加列”将数据复制到名为“keys”的新列中,并使用GREL转换:

forEach(value.split(","),v,v.trim().toLowercase()).uniques().join(",")

现在你有:

| Col1                    | keys        |
|-------------------------|-------------|
| Paul,PAUL,Edward,edward | paul,edward |

您现在可以遍历keys列中的值,并在Col1中找到第一个值,该值将使用相同的转换转换为该键:要在“密钥”列上执行此操作,您可以使用转换:

forEach(value.split(","),v,filter(cells["Col1"].value.split(","),w,w.trim().toLowercase()==v)[0]).join(",")

那应该留给你

| Col1                    | keys        |
|-------------------------|-------------|
| Paul,PAUL,Edward,edward | Paul,Edward |

当然值得注意的是,如果您的原始数据的顺序不同,您将得到不同的最终值 - 例如“保罗,保罗,爱德华,爱德华”最终将成为“保罗,爱德华”。可以做更多的工作来改善这一点,但是会有限制。

答案 1 :(得分:1)

根据您的数据,您可能还需要通过进入记录模式并执行"拆分多值单元格来解决问题。而不是你的长GREL join()表达式...从而创建每个值的额外记录行。

|Col1                       |Split      |
|Paul, PAUL, Edward, edward |Paul       |
|                           |PAUL       |
|                           |Edward     |
|                           |edward     |

从那里你可以操作Split列或者根据uniques,其他Grel表达式等创建一个新列。你可以对Col1进行填充,这样进一步的操作就不会丢失他们的关键记录& #39;保罗,保罗,爱德华,爱德华'。

请记住,OpenRefine具有很好的GREL操作,但很多功能来自Record模式,Facets和Row操作......不仅仅是Column和Cell操作。因此,不要仅限于完整的Grel语法。尝试使用OpenRefine的所有操作和模式来解决问题。

有关'拆分多值单元格的更多信息'和其他操作,请参阅我们的wiki部分:https://github.com/OpenRefine/OpenRefine/wiki/Cell-Editing#splitting-multiple-values-within-cells-to-produce-records