このページの内容

ストリーミング

--stream オプションを使うと、jqは入力テキストをストリーミング形式で解析できます。そのため、大きなJSONテキストを、解析が完了してからではなく、すぐに処理し始められます。1GBの単一のJSONテキストがある場合、ストリーミングによって、より早く処理できます。

ただし、ストリーミングを扱うのは簡単ではありません。jqプログラムの入力が、[<path>, <leaf-value>] や、いくつかの別の形式になるためです。

ストリームを扱いやすくするため、いくつかの組込み関数があります。

以下の例では、["a",["b"]] のストリーミング形式を使います。これは [[0],"a"],[[1,0],"b"],[[1,0]],[[1]] です。

ストリーミング形式には、[<path>, <leaf-value>](スカラー値、空の配列、空のオブジェクトを示すもの)と、[<path>](配列またはオブジェクトの終わりを示すもの)が含まれます。将来のjqを --stream と --seq で実行した場合、入力テキストの解析に失敗したときに、["error message"] のような追加の形式を出力する可能性があります。

truncate_stream(stream_expression)

数値を入力として受け取り、指定したストリーミング式の出力から、その数に対応する個数のパス要素を左側から切り落とします。

実行例 1

コマンド

jq 'truncate_stream([[0],"a"],[[1,0],"b"],[[1,0]],[[1]])'

入力

1

出力 1

[[0],"b"]

出力 2

[[0]]

fromstream(stream_expression)

ストリーム式の出力に対応する値を出力します。

実行例 1

コマンド

jq 'fromstream(1|truncate_stream([[0],"a"],[[1,0],"b"],[[1,0]],[[1]]))'

入力

null

出力 1

["b"]

tostream

組込み関数 tostream は、入力のストリーミング形式を出力します。

実行例 1

コマンド

jq '. as $dot|fromstream($dot|tostream)|.==$dot'

入力

[0,[1,{"a":1},{"b":2}]]

出力 1

true