如何从包含JSON作为列的CSV中选择值

vh0rcniy  于 2023-06-19  发布在  其他
关注(0)|答案(3)|浏览(89)

我有一个奇怪的CSV,其中一列是相当大的JSON数据,另一列是名称。为了清晰起见,显示了正确的JSON格式,但实际文件是扁平的,没有换行符字符。

name, 
{
"field1":
   {"name":"foo",
   "email":"test@gmail.com"},
"field2":{
     "subfield":{
          "subfield2":{
               "active":1,
               "passive":11,
               "running":111
                       }
                  }
           }
}

输入没有漂亮的格式化...

name,{"field1":{"name":"foo","email":"test@gmail.com"},"field2":{"subfield":{"subfield2":{"active":1,"passive":11,"running":111}}}}

我试图将子字段2的名称和所有唯一值输入输出(理想情况下为CSV)。

name, 
active passive running

问题是字段的数量不是常数,子字段的名称也不是常数。我尝试过使用jq、米勒和sed/awk,但运气不好,因为它结合了一个巨大的JSON blob和CSV数据。

lvmkulzt

lvmkulzt1#

如果在示例输入中运行

<input.txt sed '/name,/d' | jq -cr '.field2.subfield.subfield2 | keys[]' | paste -s -d ' ' | mlr --csv --implicit-csv-header then label name

你得到

name
active passive running

您编写的示例输出是错误的,因为如果它是一个单字段CSV,则名称后没有,,没有其他字段

name, 
active passive running

但我可能不明白你想要什么

qco9c6ql

qco9c6ql2#

你可以使用你最喜欢的CSV到TSV转换器将CSV转换为TSV,然后通过jq运行它,如下所示:

jq -rR '
  split("\t") 
  | [[.0], 
     ( .[1]|fromjson|.field2.subfield.subfield2 | keys_unsorted|join(" "))] 
  | @csv'
niknxzdl

niknxzdl3#

我花了一些时间与sed,它得到了我所需要的使用以下:

sed -e 's/.*subfield2\(.*\)}}}.*/\1/' input.txt

相关问题