有没有办法告诉uniques()忽略大小写?
我有一个像
一样运行的GRELforEach(value.split(","),v,v.trim()).uniques().join(",")
这将以逗号分隔的单元格中的每个值,然后在该单元格中吐出唯一值。如果我有一个包含的单元格,那么效果很好 保罗,保罗,它将返回两个而不仅仅是保罗'
是否可以将所有值暂时转换为大写以进行比较,然后返回您唯一的第一个拼写?
或许我应该用Python / Jython做到这一点?
答案 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