我有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会有所帮助,但是如果我需要将数据拆分成两个文件,在我看来并不是一个合适的解决方案..
答案 0 :(得分:1)
如果你必须根据你对该领域的了解自己选择正确的术语,我看不到如何自动化操作。这是一个解决方案,以匹配您的"分类"与API返回的术语中最相似的列。
使用的Grel公式是:
value.fingerprint() == cells.terms.value.replace(/\(.+\)/,'').fingerprint()
答案 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]
将在第一行和第二行中找到第一个值,在第三行中找到第二个值,在第四行中找到第四个值。这在这里说明:
公式细分如下:
希望这很清楚