Eu tenho o arquivo JSON abaixo:
{
"data": [
{
"displayName": "First Name",
"rank": 1,
"value": "VALUE"
},
{
"displayName": "Last Name",
"rank": 2,
"value": "VALUE"
},
{
"displayName": "Position",
"rank": 3,
"value": "VALUE"
},
{
"displayName": "Company Name",
"rank": 4,
"value": "VALUE"
},
{
"displayName": "Country",
"rank": 5,
"value": "VALUE"
},
]
}
Eu gostaria de ter um arquivo CSV neste formato:
First Name, Last Name, Position, Company Name, Country
VALUE, VALUE, VALUE, VALUE, VALUE, VALUE
Isso é possível usando apenas jq
? Eu não tenho nenhuma habilidade de programação.
Respostas:
jq possui um filtro, @csv, para converter uma matriz em uma sequência CSV. Esse filtro leva em consideração a maioria das complexidades associadas ao formato CSV, começando com vírgulas incorporadas nos campos. (A jq 1.5 possui um filtro semelhante, @tsv, para gerar arquivos com valores separados por tabulação.)
Obviamente, se todos os cabeçalhos e valores estiverem livres de vírgulas e aspas duplas, talvez não seja necessário usar o filtro @csv. Caso contrário, provavelmente seria melhor usá-lo.
Por exemplo, se o 'Nome da empresa' fosse 'Smith, Smith e Smith' e se os outros valores fossem mostrados abaixo, chamar jq com a opção "-r" produziria um CSV válido:
fonte
Prefiro fazer cada registro uma linha no meu CSV.
fonte
.value|tostring
vez de.value
no exemplo acima(.value|tostring)
jq -r
para retirar as aspasDado apenas esse arquivo, você pode fazer algo como:
O
.
operador seleciona um campo de um objeto / hash. Assim, começamos com.data
, que retorna a matriz com os dados nela. Em seguida, mapeamos a matriz duas vezes, primeiro selecionando o displayName e depois o valor, fornecendo duas matrizes apenas com os valores dessas chaves. Para cada matriz, juntamos os elementos com "," formando duas linhas. O-r
argumento dizjq
para não citar as seqüências resultantes.Se o seu arquivo atual for mais longo (ou seja, tiver entradas para mais de uma pessoa), você provavelmente precisará de algo um pouco mais complicado.
fonte
Eu achei
jq
difícil de entender. Aqui estão alguns Ruby:O analisador de JSON rubi vomitou sobre a vírgula à direita antes do colchete.
fonte
Desde que você marcou isso
python
e assumindo que o nome dojson
arquivo éx.json
fonte
Embora eu tenha que remover a última vírgula na sua entrada de exemplo para fazê-la funcionar, porque
jq
estava reclamando de esperar outro elemento da matriz, isso:... me pegou ...
Como funciona em poucas palavras:
[]
formulário e a.dot
notação de campo de índice vazio ..[][].displayName
.[.[][].displayName], [.[][].value]
join(", ")
função a ser unida como entidades separadas.Na verdade, fazer
[.field]
é apenas outra maneira de fazê - lo,map(.field)
mas isso é um pouco mais específico, pois especifica o nível de profundidade para recuperar os dados desejados.fonte