GREL:关于模板化导出和空值的qq开放优化

问题描述

有些表达式比这更优雅,可以避免打印NULL和单词“ NULL”? 通过阅读Open Refine的文档https://github.com/OpenRefine/OpenRefine/wiki/General-Refine-Expression-Language,我已经做到了这一点,但是感觉很奇怪而且很复杂。

干杯。

{
  "rows" : [
{{ if(isNull(cells["supplierID"].value),"","      \"supplierID\" : " + jsonize(cells["supplierID"].value)

)}},{{ if(or(isNull(cells["homePage"].value),cells["homePage"].value == "NULL"),"      \"homePage\" : " + jsonize(cells["homePage"].value)

)}}

  ]
}

解决方法

通常,我希望在导出之前使该列保持一致(即在所有情况下都包含null值,在所有情况下都包含字符串“ NULL”,但不能混合使用)。因此,您可以先对列进行转换,例如:

if(value=="NULL",null,value)

如果要先执行此操作,则可以在导出模板中使用:

forNonBlank(cells["homepage"].value,v,"      \"homePage\" : " + jsonize(v),"")

但是,如果由于某种原因不想在数据中进行此更改,则可以使用“ coalesce”功能(可从OpenRefine 3.0开始使用)获得比您所拥有的选项更为优雅的选择。从列表中选择第一个非空值:

{{ if(coalesce(cells["homepage"].value,"NULL")=="NULL","","      \"homePage\" : " + jsonize(cells["homePage"].value)) }}

如果为非null,则合并将使用cells [“ homepage”]。value的值;如果cells [“ homepage”]。value 是,则退回到使用字符串“ NULL” em> null。因此,这意味着如果您使用内容字符串“ NULL”或具有null的单元格填充-合并函数在两种情况下均输出字符串“ NULL”-这意味着您只需要检查单个条件。

coalesce已记录在https://github.com/OpenRefine/OpenRefine/wiki/GREL%20Other%20Functions