首页 > 解决方案 > OpenRefine - 将多个列值合并到新列中应该(?)工作

问题描述

我的数据包括多个列——出于我的目的——它们是相同的。在这些地方,我需要将多个选定列中的值组合成一列。例如,将列名称 1、名称 2 和名称 3 组合成一个列名称。

按照此处的指导,我正在尝试创建一个新列,其中包含来自多列的值,如下图所示:

列选项

基于列 X 对话框添加列

相信我这里的 GREL应该结合 dc.contributor.author 中的值(只是value因为这是我从中选择Edit column > Add column based on this column 的列),dc.contributor.authorEN_us(cells["dc.contributor.authorEN_us"].value),dc.contributor .author1 ( cells["dc.contributor.author1"].value) 和 dc.contributor.authoren_US ( cells["dc.contributor.authoren_US"].value)。

但是,我的新列不包含来自这些第二、第三或第四列的值,即使我知道这些值存在。

我的 GREL 语法有错误吗?我应该使用不同的方法来合并列吗?

提前感谢您的任何帮助。

标签: data-cleaningopenrefinegrel

解决方案


恐怕您一直在看的教程既过时又不完整。问题是您null在某些列中有值。在 OpenRefine 中,如果其中一个值为 ,则连接(即通过 + 连接两个字符串)返回nullnull

所以:

"Hello" + " " + "World"给出“Hello World”。

"Hello" + null + " " + "World"返回null

关于这个问题的讨论一直没完没了。直到最近,我还建议您使用:

任何一个:

coalesce(value,cells['dc.contributor.author1'].value, cells['dc.contributor.authorEN_us'].value, cells['dc.contributor.authoren_US'].value)

(在 Openrefine 3 中引入的coalesce 函数返回一系列中的第一个非空值)

或者:

value.toString() + cells['dc.contributor.authorEN_us'].value.toString() + cells['dc.contributor.authoren_US'].value.toString()

null变成空字符串'')

但是在未来的 OpenRefine 3.3(现在处于测试阶段)中,感谢@mathieu-saby,OpenRefine 将有一个菜单,让您可以轻松地合并列。你只需要更新你的版本。:)

列菜单的屏幕截图,带有子菜单


推荐阅读