J'ai le fichier JSON ci-dessous:
{
"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"
},
]
}
J'aimerais avoir un fichier CSV dans ce format:
First Name, Last Name, Position, Company Name, Country
VALUE, VALUE, VALUE, VALUE, VALUE, VALUE
Est-ce possible en utilisant seulement jq
? Je n'ai aucune compétence en programmation.
Réponses:
jq a un filtre, @csv, pour convertir un tableau en chaîne CSV. Ce filtre prend en compte la plupart des complexités associées au format CSV, à commencer par des virgules incorporées dans les champs. (jq 1.5 a un filtre similaire, @tsv, pour générer des fichiers de valeurs séparées par des tabulations.)
Bien sûr, s'il est garanti que les en-têtes et les valeurs ne contiennent pas de virgules ni de guillemets, il n'est peut-être pas nécessaire d'utiliser le filtre @csv. Sinon, il serait probablement préférable de l'utiliser.
Par exemple, si le "Nom de la société" était "Smith, Smith et Smith" et si les autres valeurs étaient comme indiqué ci-dessous, l'appel de jq avec l'option "-r" produirait un fichier CSV valide:
la source
Je préfère que chaque enregistrement soit rangé dans mon fichier CSV.
la source
.value|tostring
au lieu de.value
dans l'exemple ci-dessus(.value|tostring)
jq -r
pour dépouiller les citationsAvec juste ce fichier, vous pouvez faire quelque chose comme:
L'
.
opérateur sélectionne un champ à partir d'un objet / hachage. Ainsi, nous commençons avec.data
, qui retourne le tableau avec les données qu'il contient. Nous mappons ensuite deux fois sur le tableau, en sélectionnant d'abord le nom d'affichage, puis en sélectionnant la valeur, ce qui nous donne deux tableaux contenant uniquement les valeurs de ces clés. Pour chaque tableau, nous joignons les éléments avec "," formant deux lignes. L'-r
argument ditjq
de ne pas citer les chaînes résultantes.Si votre fichier est plus long (c.-à-d. Qu'il contient des entrées pour plus d'une personne), vous aurez probablement besoin de quelque chose d'un peu plus compliqué.
la source
J'ai eu du
jq
mal à comprendre. Voici quelques rubis:L’analyseur JSON ruby a commenté la virgule avant la parenthèse fermée.
la source
Puisque vous avez marqué ceci
python
et en supposant que le nom dujson
fichier estx.json
la source
Bien que j'ai dû supprimer la dernière virgule dans votre exemple d'entrée pour que cela fonctionne, car je me suis
jq
plaint d'attendre un autre élément de tableau, ceci:... m'a eu ...
Comment ça marche en quelques mots:
[]
forme et la.dot
notation du champ d'index vide ..[][].displayName
.[.[][].displayName], [.[][].value]
join(", ")
fonction à associer en tant qu'entités séparées.En réalité, cela
[.field]
n’est qu’une autre façon de procéder,map(.field)
mais c’est un peu plus spécifique en ce sens qu’il spécifie le niveau de profondeur pour récupérer les données souhaitées.la source