我认为这在 OpenRefine 中非常困难,并且可能使用不同的工具会更好。主要问题是 OpenRefine 不提供跨行轻松工作的能力,因此“对列求和”(或列的一部分)很棘手 - 这在https://github.com/OpenRefine/OpenRefine/issues/中有所提及200
但是,您可以通过在包含单个记录的整个项目中强制 OpenRefine 进入 Record 模式来执行此操作。完成此操作后,您可以使用以下语法访问列中的所有值:
row.record.cells["Column name"].value
这给出了列中所有非空值的数组。由于这会忽略空白值,因此为了真正查看列中的值,您必须用值填充空白单元格。
所以我认为你可能可以实现你想要的如下:
- 对于您将要使用的每一列,进行单元格转换以将虚拟值放入空单元格中 - 例如 if(isBlank(value),"null",value)
- 在项目开始时创建一个新列,并在该列的第一个单元格中放置一个值
- 切换到录制模式
此时,您的项目中应该有一个“记录” - 例如

您现在可以使用 row.record.cells["Column 1"].value 之类的语法访问列中的所有单元格。您可以将其与 'forRange' 结合使用来迭代此数组的内容,使用 row.index 作为当前行的标记。
我使用以下公式向项目添加了一个新列:
with(row.record.cells["Column 1"].value,w,if(forRange(row.index,w.length(),1,i,w[i].toNumber()).sum()> 0,"a","b"))

然后...
- 改回“行”模式
- 从原始列中删除“空”占位符

- 在“填充过滤器”列上创建一个构面

- 在我的情况下,我过滤到'a'
- 使用“填写”选项
取下过滤器

并删除“记录”列
至少可以说,这是一种冗长的方式,但到目前为止,在不去 OpenRefine 之外的情况下,我还没有找到更好的方法。我猜您可能会将步骤 5-11 压缩为一个步骤或更少的步骤。
如果您想按照 iMitwe 的建议使用 Jython 访问单元格值数组,您需要使用:
row["record"]["cells"]["Column 1"]["value"]
代替
row.record.cells["Column 1"].value
(第 5 步)