消歧说明:我最初将这个标题命名为“Nushell:将列表转换为表格”(一些搜索引擎将此作为这些单词的第一个结果),但是这个 Stack Overflow 问题可能是一个更好的“列表到表格”示例。
有没有一种惯用的方法可以将类似记录的列表转换为 Nushell 中的表?
我正在使用Stack Exchange 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
就变成了list<any>
Nushell中的一个。这意味着像这样的操作:
> $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"
nu
不幸的是,我对外壳不熟悉。不过,您绝对可以将数据作为 JSON 传递给jq
,添加带有空字符串值的缺失键,然后将其转换回 shell 的内部表示。在这里,我正在更新
questions
变量,但您可以将jq
命令标记到原始let
命令上,而不是不必要地来回转换数据。然后您可以按以下方式对其进行分组
closed_reason
:终于找到了答案。
help --find def
当我发现适当命名的(但未在 Nushell Book 中引用)命令时,我碰巧正在寻找与 完全不同的东西default
,该命令本质上是 Nushell 内置的,用于执行@Kusalananda 推荐的相同操作jq
。因此,问题中的示例可以通过以下方式修复:
结果是一个真正的 Nushell 表对象:
有了这些,我就可以开始对 Stack API 进行一些切片和切块了: