1

我有几只股票的股价清单。由于周末、节假日和可能的其他原因,缺少一些值。

差距并不一致。有些是两天,有些是更多。

我想用最后一个已知值来填补空白,但不是在列表的末尾。

我尝试在 Excel 中测试下面的几个单元格,如果它现在是空的,请进行填充。问题是由于间隙的不一致,为所有情况更改函数是一项繁琐的任务。

有没有办法测试列表的结尾?

更新 - 添加了屏幕截图。

请参阅此屏幕截图。我想填充蓝点所在的位置。红点位于列表的末尾,我不想填充这些单元格。

我正在寻找一种方法来检测列表的结尾并在检测到结尾时停止填充。

在此处输入图像描述

4

3 回答 3

1

我认为这在 OpenRefine 中非常困难,并且可能使用不同的工具会更好。主要问题是 OpenRefine 不提供跨行轻松工作的能力,因此“对列求和”(或列的一部分)很棘手 - 这在https://github.com/OpenRefine/OpenRefine/issues/中有所提及200

但是,您可以通过在包含单个记录的整个项目中强制 OpenRefine 进入 Record 模式来执行此操作。完成此操作后,您可以使用以下语法访问列中的所有值:

row.record.cells["Column name"].value

这给出了列中所有非空值的数组。由于这会忽略空白值,因此为了真正查看列中的值,您必须用值填充空白单元格。

所以我认为你可能可以实现你想要的如下:

  1. 对于您将要使用的每一列,进行单元格转换以将虚拟值放入空单元格中 - 例如 if(isBlank(value),"null",value)
  2. 在项目开始时创建一个新列,并在该列的第一个单元格中放置一个值
  3. 切换到录制模式

此时,您的项目中应该有一个“记录” - 例如

显示单个记录的 OpenRefine 屏幕截图

您现在可以使用 row.record.cells["Column 1"].value 之类的语法访问列中的所有单元格。您可以将其与 'forRange' 结合使用来迭代此数组的内容,使用 row.index 作为当前行的标记。

  1. 我使用以下公式向项目添加了一个新列:

    with(row.record.cells["Column 1"].value,w,if(forRange(row.index,w.length(),1,i,w[i].toNumber()).sum()> 0,"a","b"))

公式的结果

然后...

  1. 改回“行”模式
  2. 从原始列中删除“空”占位符

在此处输入图像描述

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

在此处输入图像描述

  1. 在我的情况下,我过滤到'a'
  2. 使用“填写”选项
  3. 取下过滤器 在此处输入图像描述

  4. 并删除“记录”列

至少可以说,这是一种冗长的方式,但到目前为止,在不去 OpenRefine 之外的情况下,我还没有找到更好的方法。我猜您可能会将步骤 5-11 压缩为一个步骤或更少的步骤。

如果您想按照 iMitwe 的建议使用 Jython 访问单元格值数组,您需要使用:

row["record"]["cells"]["Column 1"]["value"]

代替

row.record.cells["Column 1"].value

(第 5 步)

于 2015-10-13T18:30:47.643 回答
0

除非有什么我遗漏或没有看到...我会在 Date 列上进行反向排序(日期升序),然后在每一列上单独使用 Fill Down,除了最后一列,您可以在其中使用 Date facet on您的日期列以指定您要使用的确切日期范围,然后填写最后一列,然后删除日期范围方面。

于 2015-10-20T00:50:36.940 回答
0

我正在做这件事,但我认为你最好的机会是在记录模式下使用填充选项

  • 首先将您的列移动到第一列并切换到记录模式。
  • 然后使用以下 GREL:列的名称在row.record.cells["data"].value[-1]哪里data

[-1]取最后一个值并填充空白。对于带有红点的情况,由于没有值,它应该保持为空。让我们知道怎么回事。

于 2015-10-13T11:33:30.657 回答