如何使用JQ限制JSON中的值(钳位)?

时间:2019-07-05 18:01:18

标签: python json jq

我有一个应用程序,该应用程序将数据写入/连接到JSON中,然后通过图表将其显示/图形化。有时,各种事件都可能导致值超出范围。该范围是用户主观的,因此在运行时限制该范围不是我希望的方向。

我相信jq可以在这里提供帮助-理想情况下,我可以搜索> x的字段,如果它是> x,则将其替换为x。我一直在寻找jq示例,但还没有真正找到对我有意义的东西。

我花了一些时间,但是却无法做任何我认为应该做的事情……。就像,我没有不好的代码向您展示,因为我还没有让它做任何事情。我衷心希望我的要求范围缩小到足以让某人能够在上下文中向我展示,以便我可以将其扩展到更大的项目中。

这是我希望能够修改的一行:

{"cols":[{"type":"datetime","id":"Time","label":"Time"},{"type":"number","id":"Room1Temp","label":"Room One Temp"},{"type":"number","id":"Room1Set","label":"Room One Set"},{"type":"string","id":"Annot1","label":"Room One Note"},{"type":"number","id":"Room2Temp","label":"Room Two Temp"},{"type":"number","id":"Room2Set","label":"Room Two Set"},{"type":"string","id":"Annot2","label":"Room Two Note"},{"type":"number","id":"Room3Temp","label":"Room Three Temp"},{"type":"number","id":"State","label":"State"},{"type":"number","id":"Room4Temp","label":"Room Four Temp"},{"type":"number","id":"Quality","label":"Quality"}],"rows":[
{"c":[{"v":"Date(2019,6,4,20,31,13)"},{"v":68.01},{"v":68.0},null,{"v":62.02},{"v":55.89},null,null,{"v":4},{"v":69.0},{"v":1.052}]}]}

我想做类似的事情:

if JSONFile.Room2Set < 62
    set Room2Set = 62

Here's a larger block of JSON,它是下面显示的图表的来源:

Example Chart

2 个答案:

答案 0 :(得分:2)

使用函数clamp定义的函数(在〜/ .jq文件或内联中)如下:

def clamp_min($minInc): if . < $minInc then $minInc else . end;
def clamp_max($maxInc): if . > $maxInc then $maxInc else . end;
def clamp($minInc; $maxInc): clamp_min($minInc) | clamp_max($maxInc);

使用这些数据,您将需要为每一行找到相应的单元格并修改值。

$ jq --arg col "Room2Set" --argjson max '62' '
def clamp_max($maxInc): if . > $maxInc then $maxInc else . end;
(INDEX(.cols|to_entries[]|{id:.value.id,index:.key};.id)) as $cols
  | .rows[].c[$cols[$col].index] |= (objects.v |= clamp_max($max))
' input.json

答案 1 :(得分:0)

具有如下调用:

jq --arg col Room2Set --argjson mx 72  --argjson mn 62 -f clamp.jq input.json

clamp.jq包含:

def clamp: if . > $mx then $mx elif . < $mn then $mn else . end;

(.cols | map(.id) | index($col)) as $ix
| .rows[].c[$ix].v |= clamp

选定的单元格应“固定”。