我正在处理dcm2json的输出,该输出将元数据从DICOM格式的医学影像数据转换为JSON。此元数据的值主要是字符串,整数,浮点数和类似值,但它还包括以base64编码的字符串形式的内联二进制值。我们不需要那些二进制文件,它们可以变得很大,所以我需要过滤掉所有具有InlineBinary属性的元数据元素。以下是dcm2json的JSON输出的样本(非常简单):
{
"00080005": {
"vr": "CS",
"Value": ["ISO_IR 192"]
},
"00291010": {
"vr": "OB",
"InlineBinary": "Zm9vYmFyCg=="
}
}
我想将其转换为:
{
"00080005": {
"vr": "CS",
"Value": ["ISO_IR 192"]
}
}
我尝试了一些不同的方法,这些方法均无效,但最终使用了以下方法:
$ dcm2json file.dcm | jq '[to_entries | .[] | select(.value.Value)] | from_entries'
我一直在玩它,因为我不喜欢将该表达式嵌入到数组中(即[to_entries ...]
)。我想出了一些更优雅的方法,但是我对它为什么以这种方式起作用感到完全困惑:
jq 'to_entries | . - map(select(.value | has("InlineBinary") == true)) | from_entries' | less
令人困惑的是has("InlineBinary") == true
位。我首先进行比较,false
因为我想要的是那些没有该InlineBinary
属性的元素。为什么它看起来似乎与我要求的相反?考虑到我真的不了解其中的. - map(...)
结构发生了什么(我完全从另一篇帖子中提出了类似问题的信息中清除了它),我并不惊讶它做了我不理解的事情,但我想了解那是为什么:)
我感到困惑的另一件事是to_entries/from_entries/with_entries
。该手册说这些:
with_entries(foo)是to_entries的简写| map(foo)| from_entries
凉!因此将是:
jq 'with_entries(map( . - map(select(.value | has("InlineBinary") == true))))'
但这不起作用:
$ cat 1.json | jq 'with_entries(map(. - map(select(.value | has("InlineBinary") == true))))'
jq: error (at <stdin>:848): Cannot iterate over string ("00080005")
考虑到该语句在功能上是等效的,因此我不确定为什么这行不通。
感谢您提供的任何信息!
选择键值对时,with_entries
通常是选择的工具:
with_entries( select(.value | has("InlineBinary") | not) )
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句