我需要将包含预测数据的一些json转换为csv (用于gnu图)。已经尝试过几个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"},我成功地使用了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" 我需要在纯文本日期(sed??)之后创建新行。或者理想情况下将json直接压平到csv。
发布于 2018-02-22 21:10:34
正则表达式和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.98jq接收一个JSON数据流,并过滤它以提取您想要的数据,类似于sed,但用于结构化数据而不是文本。该命令将"list“数组的每个元素(.list[])和拔出"dt“字段(.dt) of 里面的物体以及"main“对象(.main[])中的所有内容都包含进来,将所有内容放入数组和将其转换为CSV行(@csv)中。
如果您对特定字段感兴趣,或者希望重新排序,也可以列出它们:
$ jq -r '.list[]|[.dt, .main.temp_min, .main.humidity] | @csv' < data.json
1519333200,271.62,88
1519344000,271.22,100把你关心的每一个人都列出来,然后忽略剩下的。
如果你想进入数据的其他部分,你也可以把它放进去:.clouds会查看clouds字段,或者你可以用.wind.speed读取风速--总是名字前面的一个点,就像你在写JavaScript一样。这个jq手册相当全面为您需要的任何自定义行为。
发布于 2019-11-09 11:53:36
我只是简单地补充一下迈克尔·荷马的答案:
如果jq表达式变得很大,我们可以用它创建一个脚本:
示例:
$ cat mkweatherreport
#!/usr/bin/jq -rf
.list[] |
[
.dt,
.main.temp_min, # in Kelvin degrees
.main.humidity
] | @csv然后:
$ mkweatherreport f.json
1519333200,271.62,88
1519344000,271.22,100https://unix.stackexchange.com/questions/425981
复制相似问题