curl
から非常に大きなJSONストリーム(数GB)を取得し、jq
で処理しようとします。jqで大きなJSONストリームを処理する
私はjq
で解析する関連出力は、結果の構造を表す文書にパックされています
{
"results":[
{
"columns": ["n"],
// get this
"data": [
{"row": [{"key1": "row1", "key2": "row1"}], "meta": [{"key": "value"}]},
{"row": [{"key1": "row2", "key2": "row2"}], "meta": [{"key": "value"}]}
// ... millions of rows
]
}
],
"errors": []
}
は私がjq
とrow
データを抽出したいです。これは単純です:
curl XYZ | jq -r -c '.results[0].data[0].row[]'
結果:curl
が完了するまで
{"key1": "row1", "key2": "row1"}
{"key1": "row2", "key2": "row2"}
しかし、これは常に待機します。
私はこれに対処するために作られた--stream
オプションでプレーしました。私は、次のコマンドを試してみましたが、完全なオブジェクトがcurl
から返されるまでも待機している:
curl XYZ | jq -n --stream 'fromstream(1|truncate_stream(inputs)) | .[].data[].row[]'
はdata
フィールドに「ジャンプ」に方法はありますし、タグを閉じるのを待たずにrow
一つずつ解析を開始しますか?
スピードだけではありません。ストリーミングメモリを使用せずに爆発し、curl/jqがクラッシュする。 –
ありがとうございました、あなたのアップデートは本当に助けになりました。すべての行が出力に結合されているので、実際にはそこに到達していません。そして、私は個々の行のすべてのキー/値のペアを収集する方法を理解していません。私はその質問のデータ記述を更新しました。 –
私がしなければならないことは '。[0] [3]'が1つのオブジェクトと等しいすべての配列を組み合わせることだけです。 –