Nota de desambiguação: eu originalmente intitulei isso de "Nushell: Converter lista em tabela" (e alguns mecanismos de pesquisa têm isso como o primeiro resultado para essas palavras), no entanto, esta pergunta do Stack Overflow pode ser um exemplo melhor de "lista para tabela".
Existe uma maneira idiomática de converter uma lista de registros semelhantes em uma tabela no Nushell?
Estou trabalhando com a API do Stack Exchange e obtendo resultados como:
let questions = ('[
{
"tags":
[
"nushell"
],
"title": "Nushell: Convert list to table"
},
{
"tags":
[
"ssh",
"tar"
],
"title": "tar through ssh session",
"closed_reason": "Duplicate"
}
]' | from json)
Repare que closed_reason
só é retornado para questões que foram encerradas, claro. Isso faz sentido -- Não há necessidade de a API desperdiçar largura de banda retornando campos vazios para a maioria das perguntas.
Mas como resultado, $questions
torna-se um list<any>
em Nushell. Isso significa que uma operação como:
> $questions | group-by closed_reason
cannot find column
... resulta em um erro (logicamente) .
Todos os resultados precisam ter a mesma estrutura para que isso funcione. Por exemplo, se todos os resultados tivessem closed_reason
's, assim:
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)
Então $questions | describe
fica:
table<tags: list<string>, title: string, closed_reason: string>
E $questions | group-by closed_reason
vai funcionar.
Existe alguma maneira de converter/"normalizar" a lista em uma tabela?
Eu tentei (com o original, list<any>
resultado):
> $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"
Infelizmente não conheço o
nu
shell. Ainda assim, você pode definitivamente passar os dados como JSON parajq
, adicionar as chaves ausentes com valores de string vazios e convertê-los de volta para a representação interna do shell.Aqui estou atualizando a
questions
variável, mas você pode marcar ojq
comando no comando originallet
em vez de converter os dados de um lado para o outro desnecessariamente.Então você pode agrupá-lo por
closed_reason
:Finalmente encontrei a resposta. Eu estava procurando algo totalmente diferente com
help --find def
, quando vi o comando apropriadamente nomeado (mas não referenciado no Nushell Book)default
, que é essencialmente um Nushell embutido para fazer a mesma coisa que @Kusalananda recomendou comjq
.Portanto, o exemplo na pergunta pode ser corrigido via:
E o resultado é um objeto de tabela Nushell real:
Com isso no lugar, posso começar a fazer alguns cortes e fatias na API do Stack: