0

我似乎在使用 Open Refine ( Google Refine 2.5 [r2407] ) 进行复杂的重复行清理时遇到了工作流问题。到目前为止,我发现的只是如何删除基于单个列的重复行

我的目标是删除基于多个列的重复行,充其量是在特定层次结构中。

例子

鉴于Refine中的以下虚拟数据

+----+---------+---------+--------+------------+------+-----------------------------------+
| id | timeAgo |  title  | author |    date    | val1 |    [After Refine, keep Record]    |
+----+---------+---------+--------+------------+------+-----------------------------------+
|  1 |      10 | Faust   | Mr. A  | 2014-01-15 |   10 | ->B, older entry                  |
|  2 |      11 | Faust   | Mr. A  | 2014-01-21 |   10 | A (because of Date)               |
|  3 |       8 | Faust   | Mr. A  | 2014-01-15 |   10 | B                                 |
|  4 |       8 | RedHead | Mr. B  | 2014-01-21 |   34 | ->D, older entry                  |
|  5 |       7 | RedHead | Mr. B  | 2014-01-21 |   34 | ->D, same time Ago, but lower ID  |
|  6 |       7 | RedHead | Mr. A  | 2014-01-01 |   13 | C (because of author, date, val1) |
|  7 |       7 | RedHead | Mr. B  | 2014-01-21 |   34 | D                                 |
+----+---------+---------+--------+------------+------+-----------------------------------+

我想根据以下逻辑杀死重复的行。如果

  • title && auther && date && val1 相同,比
  • 保留最新(最少 timeAgo)行,如果有多个,则
  • 保留 id 最高的那个

结果将是:

+---------+----+---------+---------+--------+------------+------+
| Refined | id | timeAgo |  title  | author |    date    | val1 |
+---------+----+---------+---------+--------+------------+------+
| A       |  2 |      10 | Faust   | Mr. A  | 2014-01-21 |   10 |
| B       |  3 |       8 | Faust   | Mr. A  | 2014-01-15 |   10 |
| C       |  6 |       7 | RedHead | Mr. A  | 2014-01-01 |   13 |
| D       |  7 |       7 | RedHead | Mr. B  | 2014-01-21 |   34 |
+---------+----+---------+---------+--------+------------+------+

简单的方法?

如果没有其他解决方案,谢天谢地,我采用了脚本/GREL 解决方案。

但是是否可以通过 Refines 著名的工作流“记录”来实现上述逻辑,从而可以将其提取并应用于其他相同格式的数据集?

我这样做的动机是让员工能够更周到地处理数据(超越 excel),但无需立即使用成熟的脚本语言面对他们。

4

1 回答 1

0

这听起来像是一个简单的排序问题。

  1. 按标题、作者、时间和 ID 对记录进行排序
  2. 永久重新排序行(重要 - 如果您忘记此步骤,它将不起作用)
  3. 空白标题和作者
  4. 将这两列移到最左边的两个位置
  5. 在剩余列上连接多值单元格
  6. 转换步骤 5 中的所有列,使用value.split(',')[0]以提取第一个值(如果您以正确的顺序对它们进行排序,这应该是您想要的记录的值
于 2014-05-19T07:28:36.537 回答