明確性の注意:元の名前は「Nushell:Convert List to Table」(一部の検索エンジンではこの単語の最初の結果として表示されます)でしたが、このスタックオーバーフローの質問より良い「テーブルリスト」の例になります。
同様のレコードのリストをテーブルに変換する慣用的な方法はNushellにありますか?
私は一緒に働いていますスタック交換API次の結果が得られます。
let questions = ('[
{
"tags":
[
"nushell"
],
"title": "Nushell: Convert list to table"
},
{
"tags":
[
"ssh",
"tar"
],
"title": "tar through ssh session",
"closed_reason": "Duplicate"
}
]' | from json)
もちろん、closed_reason
これは閉じた問題に対してのみ返されます。これは意味があります。 APIは、ほとんどの質問に対して空のフィールドを返すために帯域幅を無駄にする必要はありません。
しかし、結果的に$questions
Nushellの一つになりましたlist<any>
。これは次のことを意味します。
> $questions | group-by closed_reason
...(論理的)cannot find column
エラーが発生しました。
これを達成するには、すべての結果が同じ構造を持つ必要があります。たとえば、次のようにすべての結果に「がある」としますclosed_reason
。
let questions = ('[
{
"tags":
[
"nushell"
],
"title": "Nushell: Convert list to table",
"closed_reason": ""
},
{
"tags":
[
"ssh",
"tar"
],
"title": "tar through ssh session",
"closed_reason": "Duplicate"
}
]' | from json)
これにより、次のよう$questions | describe
になります。
table<tags: list<string>, title: string, closed_reason: string>
そして$questions | group-by closed_reason
それはうまくいくでしょう。
リストをテーブルに変換/「正規化」する方法はありますか?
私は(元のlist<any>
結果を使用して)次のことを試しました。
> $questions | table | group-by closed_reason
# obviously doesn't work, since the table command is just for rendering
# but worth a shot
> $questions | to csv | from csv | group-by closed_reason
# works, but loses the tag lists
> $questions | transpose | transpose | headers | reject column0 | to json
# Almost works, but still results in a list<any>
# since the first question's closed_reason becomes null
> $questions | transpose | transpose | headers | reject column0 | group-by closed_reason
# results in "can't convert nothing to string"
答え1
これで、公式の説明に従って疑問符演算子を使用できます。文書:
❯ $questions | group-by closed_reason?
╭───────────┬───────────────────────────────────────────────────────────────╮
│ │ ╭───┬─────────────┬─────────────────────────┬───────────────╮ │
│ Duplicate │ │ # │ tags │ title │ closed_reason │ │
│ │ ├───┼─────────────┼─────────────────────────┼───────────────┤ │
│ │ │ 0 │ ╭───┬─────╮ │ tar through ssh session │ Duplicate │ │
│ │ │ │ │ 0 │ ssh │ │ │ │ │
│ │ │ │ │ 1 │ tar │ │ │ │ │
│ │ │ │ ╰───┴─────╯ │ │ │ │
│ │ ╰───┴─────────────┴─────────────────────────┴───────────────╯ │
╰───────────┴───────────────────────────────────────────────────────────────╯
答え2
残念ながら、私はnu
殻に慣れていません。ただし、データをJSONに確実に渡し、空のjq
文字列値を持つ不足しているキーを追加してから、シェルの内部表現に変換することもできます。
questions
ここでは変数を更新しますが、不必要にデータを前後に変換する代わりに、jq
元のコマンドにコマンドをタグ付けすることができます。let
let questions = ($questions | to json | jq '.[].closed_reason += ""' | from json)
その後、次のようにグループ化できますclosed_reason
。
〉$questions | group-by closed_reason
╭───────────┬───────────────╮
│ │ [table 1 row] │
│ Duplicate │ [table 1 row] │
╰───────────┴───────────────╯
答え3
ついに答えを見つけました。help --find def
私は適切に名前が付けられましたが、Nushellの本では参照されていないコマンドを見つけたときにまったく異なるものを探していました。default
これは、基本的に次のことを行うためのNushell組み込みコマンドです。@Kusalanandaがおすすめそしてjq
。
したがって、質問の例は次のように修正できます。
> $questions | default "" closed_reason | group-by closed_reason
╭───────────┬───────────────╮
│ │ [table 1 row] │
│ Duplicate │ [table 1 row] │
╰───────────┴───────────────╯
結果は実際のNushellテーブルオブジェクトです。
> $questions | default "" closed_reason | describe
table<tags: list<string>, title: string, closed_reason: string>
これにより、Stack API でいくつかのスライシングとダイシング操作を開始できます。
> $questions |
default "" closed_reason |
where closed_reason == "Duplicate" |
update tags { $in.tags | str collect ','}
╭───┬─────────┬─────────────────────────┬───────────────╮
│ # │ tags │ title │ closed_reason │
├───┼─────────┼─────────────────────────┼───────────────┤
│ 0 │ ssh,tar │ tar through ssh session │ Duplicate │
╰───┴─────────┴─────────────────────────┴───────────────╯