openweathermap jsonをcsvに

openweathermap jsonをcsvに

予測データを含む一部の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"},

また美しい印刷:

{
  "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に直接平面化する必要があります。

ベストアンサー1

正規表現は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

jqJSONデータストリームを受け取り、それをフィルタリングして、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

興味のある項目を1つずつ一覧表示し、残りの項目は無視してください。


データの他の部分について知りたい場合は、ここに入れることもできます。.cloudsそのフィールドを調べるcloudsか、次のコマンドを使用して風速フィールドを読み取ることができます.wind.speed。または、常に名前の前に - を使用できます。これはjqかなり包括的です必要なカスタム動作のため。

おすすめ記事