OpenRefine:根据另一列的变量选择值

时间:2017-05-21 21:29:18

标签: jython openrefine grel

我有OpenRefine的问题。我正在添加一个基于url的新列,并从那里调用API从受控词汇表(AAT)中获取一些术语。 我解析结果,我获得了一个多值单元格,如:

http://vocab.getty.edu/aat/300041366||aquatints (prints)::http://vocab.getty.edu/aat/300053242||aquatint (printing process)::http://vocab.getty.edu/aat/300191265||dust bags::http://vocab.getty.edu/aat/300191278||dust boxes::http://vocab.getty.edu/aat/300191278||dust boxes::http://vocab.getty.edu/aat/300191278||dust boxes::http://vocab.getty.edu/aat/300249564||aquatinters::http://vocab.getty.edu/aat/300249564||aquatinters::http://vocab.getty.edu/aat/300249564||aquatinters::http://vocab.getty.edu/aat/300249564||aquatinters::http://vocab.getty.edu/aat/300053242||aquatint (printing process)::http://vocab.getty.edu/aat/300041366||aquatints (prints)::http://vocab.getty.edu/aat/300041368||sandpaper aquatints::http://vocab.getty.edu/aat/300041368||sandpaper aquatints

我拥有当前结构:

  

URI || Corresponding_TERM :: URI || Corresponding_TERM

我现在需要选择其中一条记录。我的解决方案是使用
value.split("::")[0]
为了选择我想要的元素。
不幸的是,这个解决方案有很明显的缺点,因为数组中元素的顺序不是常数,所以如果第一个元素[0]对于一个记录是正确的,那么它可能不适用于下一个。

为了更好地解释自己,我现在有了这种结构

-----------------------------------------------------------
|ID | Classification | Term_From_Thesaurus                |  
| 1 | Aquatints      | uri||term1::uri||term2::           | 
| 1 | Aquatints      | uri||term1::uri||term2::           | 
| 2 | Drypoints      | uri||term3::uri||term4::           |
| 3 | Woodcut        | uri||term5::uri||term6::uri||term7 |
-----------------------------------------------------------  

我需要将term1与Aquatints联系起来,将第4项与Drypoints联系起来,将第7项与Woodcut联系起来。

我该怎么做? 一个解决方案可能是使用方面和大量的手工工作,但也许有一个更好的? 怎么去每个记录,如果ID = 1,他们应该使用term1,如果ID = 2应该使用术语4等。这可能吗?我真诚地不知道如何使用另一列的值作为变量来确定操作的结果。 cell.cross会有所帮助,但是如果我需要将数据拆分成两个文件,在我看来并不是一个合适的解决方案..

2 个答案:

答案 0 :(得分:1)

如果你必须根据你对该领域的了解自己选择正确的术语,我看不到如何自动化操作。这是一个解决方案,以匹配您的"分类"与API返回的术语中最相似的列。

使用的Grel公式是:

value.fingerprint() == cells.terms.value.replace(/\(.+\)/,'').fingerprint()

enter image description here

答案 1 :(得分:1)

所以我不确定我是否正确理解了您的问题,但 可能根据另一列中的变量选择值""

如果你有:

-----------------------------------------------------------
|ID | Classification | Term_From_Thesaurus                |  
| 1 | Aquatints      | uri||term1::uri||term2::           | 
| 1 | Aquatints      | uri||term1::uri||term2::           | 
| 2 | Drypoints      | uri||term3::uri||term4::           |
| 3 | Woodcut        | uri||term5::uri||term6::uri||term7 |
-----------------------------------------------------------

然后,如果您拆分' Term_From_Thesaurus'列成一个数组,然后你可以使用' ID'中的数字列,用于选择数组中的相关条目。但是,请注意,要使其工作,您需要将ID列中的数字转换为数字类型(如果它已经不存在)。在这个例子中,我假设ID列中的数字以String而不是Number开头。

所以公式:

value.split("::")[cells.ID.value.toNumber()-1]

将在第一行和第二行中找到第一个值,在第三行中找到第二个值,在第四行中找到第四个值。这在这里说明:

Screenshot illustrating formula given above

公式细分如下:

  • value.split(" ::")=将URI /术语对列表拆分为数组
  • cells.ID.value.toNumber()=将ID列中的值转换为 数字类型
  • -1 =因为数组成员从零开始计算

希望这很清楚