83582


jqを使用してjsonファイルをcsvに変換したいです。  
環境、インプットとなるjsonファイル、期待するアウトプット(csvファイル)を次に示します。

_**〇環境**_  
centOS7.6  
jq-1.6

_**〇インプットファイル(jsonファイル)**_

[code]

    {
        "count":000,
        "resultList": {
          "from": 1,
          "result": [
            {
              "IOs": 0.0000,
              "timestamp": 1633359600000
            },
            {
              "IOs": 1.0000,
              "timestamp": 1633350000000
            }
          ],
          "to":000
        }
    }
    
[/code]

_**〇期待するアウトプット(csvファイル)**_

[code]

    IOs,timestamp
    0.0000,1633359600000
    1.0000,1633350000000
    
[/code]

_**※補足**_  
result内の値をcsv化したいです。  
1行目にkey名が表題としてほしいです。  
2行目以降にvalueが羅列する形を期待しています。  
key名(IOs,timestamp)は、固定ではなく様々なkey名と数に対応するようにしたいです。

_**〇試したこと**_  
2回実行になってしまいますが、  
1回目の実行：1行目のkey名の表題を出力(※1)  
2回目の実行：result配下の値を出力(※2)  
という形で実現できないか、と考えました。

[code]

    // (※1)
    # jq -r '[.resultList.result|.[]|[keys]|.[]|.[]]|unique|@csv' test.json | tee -a ./out.csv
    "IOs","timestamp"
    #
    // (※2)
    # jq '.resultList.result[] | [.IOs,.timestamp]|@csv' test.json | tee -a ./out.csv
    "0,1633359600000"
    "1,1633350000000"
    #
    # cat ./out.csv
    "IOs","timestamp"
    "0,1633359600000"
    "1,1633350000000"
    #
    
[/code]

_**〇問題**_  
2回目の実行にてkey名([.IOs,.timestamp])を指定しての実行しか方法が分からずに困っております。  
正規表現などで、key名を指定せずに実行する方法はないでしょうか。  
その際、key数も可変的に対応できるようにできるのが理想となります。

また、上記のような2回実行しないでもよい方法がございましたらご教示いただけますと幸いです。  
よろしくお願いいたします。


CC BY-SA 4.0
2021-11-12T08:02:36.703
83581
2021-11-12T17:58:20.977
49057
question
linux json jq
jqを使用してjsonファイルをcsvに変換したい

[code]

    $ cat test.json | jq -r '
        .resultList.result|[.[0]|keys], map([.[]])|.[]|@csv'
    
    #
    "IOs","timestamp"
    0,1633359600000
    1,1633350000000
    
[/code]

`@csv` を使っているので `-r`(raw output)
オプションが無視されています。ヘッダ部のカラム名に付いているダブルクォートを除去したい場合は、ヘッダ部にだけ `join` を使うと良いかと思います。

[code]

    $ cat test.json | jq -r '
        .resultList.result|(.[0]|keys|join(",")), (map([.[]])|.[]|@csv)'
    #
    IOs,timestamp
    0,1633359600000
    1,1633350000000
    
[/code]

**余談**

[pandas - Python Data Analysis Library](https://pandas.pydata.org/) を使うと、JSON
形式のデータを簡単に CSV 形式へ変換することができます。

[code]

    import json
    import pandas as pd
    
    json_file = 'test.json'
    
    with open(json_file) as f:
      json_data = json.load(f)
    
    df = pd.json_normalize(json_data['resultList']['result'])
    df.to_csv('out.csv', float_format='%.4f', index=False)
    
[/code]

**out.csv**

[code]

    IOs,timestamp
    0.0000,1633359600000
    1.0000,1633350000000
    
[/code]


CC BY-SA 4.0
2021-11-12T08:50:36.890
83582
2021-11-12T17:58:20.977
2021-11-12T17:58:20.977
47127
47127
83581
answer