Tenho uma grande tabela de dados que gostaria de converter para json e não tenho certeza se uma ferramenta como jq, mlr ou similar seria capaz de executar tal tarefa sem ter que recorrer às minhas poucas habilidades em awk.
Tabela de amostra:
Balance_sheet for AAPL:
2023-09-30 2022-09-30 2021-09-30 2020-09-30
Treasury Shares Number 0.0 NaN NaN NaN
Ordinary Shares Number 15550061000.0 15943425000.0 16426786000.0 16976763000.0
Saída preferida:
{
"Balance_sheet for AAPL": {
"Treasury Shares Number": {
"2023-09-30": "0.0",
"2022-09-30": "NaN",
"2021-09-30": "NaN",
"2020-09-30": "NaN"
},
"Ordinary Shares Number": {
"2023-09-30": "15550061000.0",
"2022-09-30": "15943425000.0",
"2021-09-30": "16426786000.0",
"2020-09-30": "16976763000.0"
}
}
}
O seguinte formato também funcionaria, mas menos desejado:
{
"Balance_sheet for AAPL": {
"2023-09-30": {
"Treasury Shares Number": "0.0",
"Ordinary Shares Number": "15550061000.0"
},
"2022-09-30": {
"Treasury Shares Number": "NaN",
"Ordinary Shares Number": "15943425000.0"
},
"2021-09-30": {
"Treasury Shares Number": "NaN",
"Ordinary Shares Number": "16426786000.0"
},
"2020-09-30": {
"Treasury Shares Number": "NaN",
"Ordinary Shares Number": "16976763000.0"
}
}
}
Alguém conhece um método lógico de fazer isso?
Eu usaria
perl
:Observe que como os objetos JSON são representações de matrizes associativas Perl, a ordem dos membros dentro deles será aleatória. Você pode obter uma ordem consistente definindo o
canonical
sinalizador (JSON::PP->new->pretty->canonical->encode(\%j)
) onde cada objeto terá membros classificados por chave.Se for importante que a ordem dos campos nos objetos JSON reflita a ordem na tabela, conforme mencionado em
perldoc JSON::PP
, você poderá vincular essas matrizes a diferentes tipos de hashes que preservam a ordem usando coisas comoTie::Hash::Indexed
(libtie-hash-indexed-perl
pacote Debian) é um dos vários módulos que fornecem hashes ordenados.Caso isso seja importante, para um formato mais próximo do formato esperado com recuo de 4 espaços e espaços depois, mas não antes do
:
s, substituapretty
porindent->indent_length(4)->space_after
(indent_length(2)
parajq
impressão bonita no estilo -).Usando qualquer awk POSIX:
Se você precisar lidar com vários blocos de "Balanço Patrimonial", basta adicionar isto:
imediatamente abaixo da
sub()
linha, por exemplo, dada esta entrada:este roteiro:
produzirá esta saída:
Usando Raku (anteriormente conhecido como Perl_6)
Acima está uma resposta codificada em Raku, um membro da família Perl de linguagens de programação. Dado o arquivo de teste limitado do "Balanço" publicado pelo OP, o 'pré-processamento' da folha é correspondentemente limitado e possivelmente personalizado. As primeiras linhas de codificação usadas para transformar os dados em um formato padrão devem, portanto, ser interpretadas como dando um 'sabor' da linguagem Raku, e não pretendem representar um método para lidar com todos os 'Balanços'.
JSON::Fast
módulo Raku é carregado na linha de comando.$a
escalar,trim
-ming fora do espaço em branco final.slurp
é o restante do arquivo na memória, b ). acrescenta a"Date"
string, c ). divide tudo emlines
, d ). cada umline
émap
pedado, a fim de: e ).subst
ite letras alfabéticas% " "
separadas por espaço de um único caractere (na substituição, metade dostrans
transformados em_
sublinhados, o que corrige os rótulos das linhas). Então finalmente f ). os dados são divididos nos\s+
espaços em branco restantes e esta tabela é armazenada na@a
matriz.@a
tabela é[Z]
transformada em "zip" de forma que as linhas se tornem colunas e vice-versa (veja o exemplo abaixo).%h
é declarado.%()
hash anônimo contendo pares de valores-chave é criado, cada par com uma Data (rótulo de linha) como chave para cada valor numérico de coluna de dados correspondente (aqui, o índice[1..*]
descarta o emparelhamento de "rótulos"). b ). Adicionando outro nível, o rótulo "Compartilhamentos" apropriado se torna a chave para o valor%()
de hash anônimo . As colunas "Compartilhamentos" convertidas em chaves/valores são adicionadas ao hash.append
%h
$a
cabeçalho "Balance_Sheet" é adicionado de volta como chave ao%h
hash como value , e esta tabela hash final (agora multinível) é convertidato-json()
, adicionando o:sorted-keys
argumento nomeado e saindoput
.Entrada de amostra:
Exemplo de tabela de entrada após
[Z]
a transformação (menos a linha de cabeçalho "Balance_Sheet"):Resultado Final
JSON
:https://raku.land/cpan:TIMOTIMO/JSON::Rápido
https://docs.raku.org/idioma/hashmap
https://docs.raku.org/
https://raku.org