我需要将一些包含预测数据的 json 转换为 csv(用于 gnuplot)。尝试了几个 json2csv 实用程序
json示例:
{"cod":"200","message":0.006,"cnt":40,"list":[{"dt":1519333200,"main":{"temp":271.62,"temp_min":271.62,"temp_max":272.921,"pressure":1028.3,"sea_level":1037.2,"grnd_level":1028.3,"humidity":88,"temp_kf":-1.3},"weather":[{"id":800,"main":"Clear","description":"clear sky","icon":"01n"}],"clouds":{"all":0},"wind":{"speed":4.86,"deg":78.004},"rain":{},"snow":{},"sys":{"pod":"n"},"dt_txt":"2018-02-22 21:00:00"},{"dt":1519344000,"main":{"temp":271.22,"temp_min":271.22,"temp_max":272.193,"pressure":1028.11,"sea_level":1037.04,"grnd_level":1028.11,"humidity":100,"temp_kf":-0.98},"weather":[{"id":800,"main":"Clear","description":"clear sky","icon":"01n"}],"clouds":{"all":0},"wind":{"speed":4.52,"deg":80.0016},"rain":{},"snow":{},"sys":{"pod":"n"},"dt_txt":"2018-02-23 00:00:00"},
Run Code Online (Sandbox Code Playgroud)
我设法使用 json2csv 来展平数据(并删除前几个不需要的字段):
1519333200 271.62 271.62 272.921 1028.3 1037.2 1028.3 88 -1.3 800 "Clear" "clear sky" "01n" 0 4.86 78.004 "{}" "{}" "n"
"2018-02-22 21:00:00" 1519344000 271.22 271.22 272.193 1028.11 1037.04 1028.11 100 -0.98 800 "Clear" "clear sky" "01n" 0 4.52 80.0016 "{}" "{}"
"n" "2018-02-23 00:00:00"
Run Code Online (Sandbox Code Playgroud)
我需要在纯文本日期(sed??)之后创建新行,或者理想情况下将 json 直接展平为 csv
正则表达式sed
并不适合这种任务,但使用jq
JSON 处理工具相当简单:
$ jq -r '.list[]|[.dt, .main[]] | @csv' < data.json
1519333200,271.62,271.62,272.921,1028.3,1037.2,1028.3,88,-1.3
1519344000,271.22,271.22,272.193,1028.11,1037.04,1028.11,100,-0.98
Run Code Online (Sandbox Code Playgroud)
jq
接收 JSON 数据流并对其进行过滤以提取您想要的数据,类似于sed
但用于结构化数据而不是文本。这个命令需要的“列表”阵列(的每个元素.list[]
)和脸蛋儿出“DT”字段(.dt
)的对象内部与“主”对象一切沿太(.main[]
),将整幅到一个数组,转换该到 CSV 行 ( @csv
)。
如果您对特定字段感兴趣,或者您想对它们重新排序,您也可以将它们列出来:
$ jq -r '.list[]|[.dt, .main.temp_min, .main.humidity] | @csv' < data.json
1519333200,271.62,88
1519344000,271.22,100
Run Code Online (Sandbox Code Playgroud)
只需列出您关心的每一个,而忽略其余的。
如果你想进入数据的其他部分,你也可以把它放在那里:.clouds
将查看clouds
字段,或者你可以读取风速.wind.speed
- 在名称之前总是一个点,就像你在编写 JavaScript 一样。对于您需要的任何自定义行为,该jq
手册都非常全面。