2017-08-16 4 views
0

J'essaie de scinder mon objet json en plusieurs tableaux json. La commande ci-dessous fonctionne sous Linux pour diviser le fichier en plusieurs tableaux putRequest.scission de json en plusieurs fichiers dans Windows

jq -cM --argjson sublen '2' 'range(0; length; $sublen) as $i | .[$i:$i+$sublen]' \ 
input.json | split -l 1 -da 3 - meta2_ 

Référence: Split a JSON array into multiple files using command line tools

directement en cours d'exécution ci-dessous commande dans l'invite de commande me donne 3 demandes de vente.

jq ".MusicCollection[]" music.json 

Cependant, quand je boucle ci-dessous pour en script batch, il me donne juste }. Est-ce que quelqu'un peut me guider comme je devrais obtenir la même sortie de l'invite de commande avec la boucle for?

+0

Il ne ressort pas clairement de votre question ce que vous aimeriez obtenir comme résultat. Pourriez-vous être assez aimable pour être plus précis - montrer le contenu du fichier résultant (ou chacun d'eux si vous voulez avoir l'ensemble) en fonction du fichier d'entrée que vous avez montré dans cette question – jsxt

+0

I Je ne suis pas sûr de ce que vous demandez exactement, mais ... l'invite de commande Windows n'a pas d'équivalent d'un type de tableau pour les variables. Est-ce ce que vous essayez d'obtenir? –

+0

@jsxt: J'ai besoin d'un o/p dans plusieurs fichiers. Ex. Si je définis une taille de lot de 2, je devrais obtenir 2 objets JSON comme mentionné ci-dessous dans des fichiers différents. Fichier 1: {"MusicCollection": [{"PutRequest": {"Item": {"Artiste": {"S": "Personne ne sait"}, "SongTitle": {"S": "Appel Me Today "}," AlbumTitle ": {" S ":" Quelque peu célèbre "}}}}, {" PutRequest ": {" Item ": {" Artiste ": {" S ":" Acme Band "}," SongTitle ": {" S ":" Happy Day "}," AlbumTitle ": {" S ":" Songs About Life "}}}}]} Fichier 2: {" MusicCollection ": [{" PutRequest " : {"Item": {"Artiste": {"S": "Personne ne le sait"}, "Titre de chanson": {"S": "Scared de mon ombre"}, "Titre de l'album": {"S": "Blue Sky Blues"}}}}}} – Dwarrior

Répondre

0

Celui-ci vous permet de diviser putRequest à un ensemble de tableaux ne comportant pas plus 2 articles

jq -c "[ .MusicCollection[] ] | range(0; length; 2) as $i | { MusicCollection: .[ $i:$i+2 ] }" input.json

Je suppose que cela pourrait vous aider à comprendre le script suivant. Il suppose que les noms de chaque fichier généré correspondent au modèle FileN (où N est un nombre).

@echo off 

rem stop variable expansion while using them under loop 
setlocal enabledelayedexpansion 

rem initialize the counters 
set /a "FILENUM=0" 
set /a "ARRAYLENGTH=2" 

for /f "tokens=*" %%a in (' 
    jq -c --argjson L "!ARRAYLENGTH!" "[ .MusicCollection[] ] | range(0; length; $L) as $i | { MusicCollection: .[ $i:$i+$L ] }" input.json 
') do (
    rem set the counter to the next file 
    set /a "FILENUM+=1" 

    rem print results 
    echo:File !FILENUM!: 
    echo:%%~a 
    echo: 

    rem uncomment to turn on printing to files called FileN 
    rem echo:%%~a>File!FILENUM! 
) 
+0

Oui, c'est possible mais la méthode pour éviter de prier EOL avant EOF est un peu compliquée. Recherchez la solution sur ss64.com ou sur dostips.com. – jsxt

+0

Merci beaucoup! Vous avez répondu de la manière la plus simple. Non seulement j'ai appris à utiliser l'expression jq, mais aussi, comment utiliser le fichier batch pour l'obtenir dans la fenêtre. Juste 2 questions si ..Je vois un nouveau caractère de ligne à la fin de chaque fichier. Est-il possible de l'enlever? De plus, l'invite de commande s'arrête si je transmets un gros fichier avec ~ 2000 lignes. Semble être un problème avec jq pipe? Même lorsque j'ai passé un chemin absolu - c: \ cli \ input.json, cela n'a pas aidé. – Dwarrior

+0

Merci d'avoir répondu à la 1ère partie. En fait, je l'ai mis à jour avec la 2ème question. J'ai accepté votre réponse, mais laissez-moi savoir si j'ai besoin de créer un autre post pour le crash de jq. J'ai fait référence au lien ci-dessous, mais n'a pas aidé. https://stackoverflow.com/questions/45613545/jq-crashing-under-windows-10-using-any-command – Dwarrior

0

Puisque vous avez jq dans votre environnement, il semble raisonnable de supposer que vous pouvez aussi utiliser awk sans trop de difficulté. Si oui, vous pourriez redirigez la sortie de JSONLines de JQ (appelé avec l'option -c) à une commande awk le long des lignes suivantes:

awk -v mx=2 'BEGIN{n=0} 
    n%mx == 0 { 
     nf++; close(out); 
     out="OUTPUT."nf".json"; 
    } 
    {n++; print > out}'