openweathermap json para csv

1

Eu preciso converter alguns dados de previsão contendo json para csv (para uso no gnuplot). Já tentei alguns utilitários json2csv

amostra de 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"},

Consegui usar o json2csv para nivelar os dados (e cortar os primeiros campos desnecessários):

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" 

Eu preciso criar as novas linhas após a data de texto simples (sed ??) ou idealmente achatar o json diretamente para csv

    
por maxillis 22.02.2018 / 21:53

1 resposta

4

Expressões regulares e sed não combinam muito com esse tipo de tarefa, mas é bastante simples usar jq , uma ferramenta de processamento 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

jq recebe um fluxo de dados JSON e filtra-o para extrair os dados desejados, de forma análoga a sed , mas para dados estruturados, em vez de texto. Este comando toma cada elemento da matriz "list" ( .list[] ) e arranca o campo "dt" ( .dt ) de o objeto dentro junto com tudo no objeto "principal" também ( .main[] ) , colocando todo o lote em uma matriz e convertendo isso para uma linha CSV ( @csv ) .

Se você estiver interessado em campos específicos ou quiser reorganizá-los, também poderá listá-los:

$ jq -r '.list[]|[.dt, .main.temp_min, .main.humidity] | @csv' < data.json
1519333200,271.62,88
1519344000,271.22,100

Basta listar cada um com quem você se importa e ignorar o resto.

Se você quiser entrar em outras partes dos dados, você pode colocar isso lá também: .clouds irá olhar para o campo clouds , ou você pode ler a velocidade do vento com .wind.speed - sempre um ponto antes do nome, como se você estivesse escrevendo JavaScript. O manual jq é bastante abrangente para qualquer comportamento personalizado que você precise.

    
por 22.02.2018 / 22:10

Tags