首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >openweathermap json to csv

openweathermap json to csv
EN

Unix & Linux用户
提问于 2018-02-22 20:53:15
回答 2查看 612关注 0票数 4

我需要将包含预测数据的一些json转换为csv (用于gnu图)。已经尝试过几个json2csv实用程序

json样本:

代码语言:javascript
复制
{"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来平平数据(并削减了前几个不需要的字段):

代码语言:javascript
复制
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。

EN

回答 2

Unix & Linux用户

发布于 2018-02-22 21:10:34

正则表达式和sed并不能很好地匹配这类任务,但使用jq (一种JSON处理工具)非常简单:

代码语言:javascript
复制
$ 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

jq接收一个JSON数据流,并过滤它以提取您想要的数据,类似于sed,但用于结构化数据而不是文本。该命令将"list“数组的每个元素(.list[])拔出"dt“字段(.dt) of 里面的物体以及"main“对象(.main[])中的所有内容都包含进来,将所有内容放入数组和将其转换为CSV行(@csv)中。

如果您对特定字段感兴趣,或者希望重新排序,也可以列出它们:

代码语言:javascript
复制
$ 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手册相当全面为您需要的任何自定义行为。

票数 6
EN

Unix & Linux用户

发布于 2019-11-09 11:53:36

我只是简单地补充一下迈克尔·荷马的答案:

如果jq表达式变得很大,我们可以用它创建一个脚本:

示例:

代码语言:javascript
复制
$ cat mkweatherreport
#!/usr/bin/jq -rf
.list[] |
  [
     .dt,
     .main.temp_min,        # in Kelvin degrees
     .main.humidity
  ] | @csv

然后:

代码语言:javascript
复制
$ mkweatherreport f.json
1519333200,271.62,88
1519344000,271.22,100
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/425981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档