OpenRefine - 填充单元格但不在列表末尾

时间:2015-10-12 07:04:19

标签: openrefine

我有几个股票的股票价格清单。由于周末,假期和其他原因,一些价值观缺失。

差距不一致。有些是两天,有些不止于此。

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

我已尝试在Excel中测试下面的几个单元格,如果它现在为空,请填写。问题在于,由于差距的不一致,改变所有案例的功能是一项繁琐的工作。

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

更新 - 添加了截图。

查看此截图。我想填补蓝点的位置。红点位于列表的末尾,我不想填充这些单元格。

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

enter image description here

3 个答案:

答案 0 :(得分:1)

我认为这在OpenRefine中非常困难,可能一个不同的工具可以更好地工作。主要问题是OpenRefine不能提供跨行轻松工作的能力,因此“汇总列”(或列的一部分)很棘手 - 这在https://github.com/OpenRefine/OpenRefine/issues/200中提到

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

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

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

所以我认为你可以达到你想要的效果如下:

  1. 对于您要使用的每个列,执行单元转换以将虚拟值放入空单元格中 - 例如如果(的isBlank(值), “空”,值)
  2. 在项目开始时创建一个新列,并将一个值放在该列的第一个单元格中
  3. 切换到录制模式
  4. 此时,您的项目中应该只有一个“记录” - 例如

    OpenRefine screenshot showing single record

    您现在可以使用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, “一”, “b”))

    2. Outcome of formula

      则...

      1. 更改回“行”模式
      2. 从原始列中删除“null”占位符
      3. enter image description here

        1. 在“填充过滤器”列上创建构面
        2. enter image description here

          1. 在我的情况下,我过滤到'a'
          2. 使用'填充'选项
          3. 删除过滤器 enter image description here

          4. 并删除“记录”栏

          5. 相反,这是一个漫长的方式,至少可以说,但到目前为止,我还没有找到更好的东西,而不是去OpenRefine以外。我猜你可以将步骤5-11压缩成一步或更少的步骤。

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

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

            而不是

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

            (第5步)

答案 1 :(得分:0)

我正在做这件事,但我认为我最好的机会是使用fill down option in record mode

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

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

答案 2 :(得分:0)

除非有我遗漏或没看到的东西...... 我只是在Date列上反向排序(日期升序),然后在每一列上单独使用Fill Down,但最后一列除外,您可以在列Date上使用Date facet来指定您想要的确切日期范围使用,然后填写最后一列,然后删除日期范围方面。