Tengo el siguiente archivo JSON:
{
"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"
},
]
}
Me gustaría tener un archivo CSV en este formato:
First Name, Last Name, Position, Company Name, Country
VALUE, VALUE, VALUE, VALUE, VALUE, VALUE
¿Es esto posible usando solo jq
? No tengo ninguna habilidad de programación.
Respuestas:
jq tiene un filtro, @csv, para convertir una matriz en una cadena CSV. Este filtro tiene en cuenta la mayoría de las complejidades asociadas con el formato CSV, comenzando con comas incrustadas en los campos. (jq 1.5 tiene un filtro similar, @tsv, para generar archivos de valores separados por tabulaciones).
Por supuesto, si los encabezados y los valores están libres de comas y comillas dobles, entonces puede que no sea necesario usar el filtro @csv. De lo contrario, probablemente sería mejor usarlo.
Por ejemplo, si el 'Nombre de la compañía' fuera 'Smith, Smith y Smith', y si los otros valores fueran los que se muestran a continuación, invocar jq con la opción "-r" produciría un CSV válido:
fuente
Prefiero hacer que cada registro sea una fila en mi CSV.
fuente
.value|tostring
lugar del.value
ejemplo anterior(.value|tostring)
jq -r
para quitar las comillasDado solo este archivo, puede hacer algo como:
El
.
operador selecciona un campo de un objeto / hash. Por lo tanto, comenzamos con.data
, que devuelve la matriz con los datos que contiene. Luego mapeamos dos veces la matriz, primero seleccionando el tee, luego seleccionando el valor, dándonos dos matrices con solo los valores de esas claves. Para cada matriz, unimos los elementos con "," formando dos líneas. El-r
argumento le dicejq
que no cite las cadenas resultantes.Si su archivo real es más largo (es decir, tiene entradas para más de una persona), es probable que necesite algo un poco más complicado.
fuente
Me resulta
jq
difícil entenderlo. Aquí hay un poco de Ruby:El analizador ruby JSON vomitó sobre la coma final antes del corchete cerrado.
fuente
Desde que etiquetó esto
python
y suponiendo que el nombre deljson
archivo esx.json
fuente
Aunque tuve que eliminar la última coma en su entrada de ejemplo para que funcione porque
jq
se quejaba de esperar otro elemento de matriz, esto:...me consiguió...
Cómo funciona en pocas palabras:
[]
formulario de índice vacío y la.dot
notación..[][].displayName
.[.[][].displayName], [.[][].value]
join(", ")
función para unirlos como entidades separadas.En verdad, hacer
[.field]
es simplemente otra forma de hacerlo,map(.field)
pero esto es un poco más específico, ya que especifica el nivel de profundidad para recuperar los datos deseados.fuente