2017-08-16 1 views
0

Ich versuche, mein JSON-Objekt in mehrere JSON-Arrays zu teilen.JSON in mehrere Dateien in Windows zerlegen

Befehl in nach Post funktioniert in Linux zum Aufteilen der Datei in mehrere PutRequest-Arrays.

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

Referenz: Split a JSON array into multiple files using command line tools

Direkt unter Befehl in Eingabeaufforderung gibt mir 3 Put-Anfragen.

jq ".MusicCollection[]" music.json 

Allerdings, wenn ich unten für Schleife in Batch-Skript verwendet, es gibt mir nur }.

Kann mir bitte jemand sagen, wie ich die gleiche Ausgabe der Eingabeaufforderung mit der for-Schleife bekommen soll?

+0

Es ist nicht klar aus Ihrer Frage, was Sie als Ergebnis erhalten möchten. Könnten Sie so nett sein, genauer zu sein - zeigen Sie den Inhalt der resultierenden Datei (oder jedes davon, wenn Sie die Menge haben möchten) basierend auf der Eingabedatei, die Sie in dieser Frage gezeigt haben – jsxt

+0

I Ich bin mir nicht sicher, was genau Sie fragen, aber ... Windows-Eingabeaufforderung hat kein Äquivalent eines Array-Typs für Variablen. Ist das, was du versuchst zu bekommen? –

+0

@jsxt: Ich brauche ein o/p in mehreren Dateien. Ex. Wenn ich eine Stapelgröße von 2 definiere, sollte ich 2 Json-Objekte wie unten erwähnt in verschiedenen Dateien bekommen. Datei 1: {"MusicCollection": [{"PutRequest": {"Element": {"Artist": {"S": "Niemand, den Sie kennen"}, "SongTitle": {"S": "Call Me Today "}," AlbumTitle ": {" S ":" Etwas berühmt "}}}}, {" PutRequest ": {" Element ": {" Artist ": {" S ":" Acme Band "}," SongTitle ": {" S ":" Happy Day "}," AlbumTitle ": {" S ":" Lieder über das Leben "}}}}]} Datei 2: {" MusicCollection ": [{" PutRequest " : {"Item": {"Künstler": {"S": "Niemand, den du kennst"}, "SongTitle": {"S": "Angst vor meinem Schatten"}, "AlbumTitle": {"S": "Blue Sky Blues"}}}}]} – Dwarrior

Antwort

0

Dies ermöglicht es Ihnen, putRequest gesetzt von Arrays aufgeteilt, die nicht mehr als 2 Artikel

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

ich denke, das könnte Ihnen helfen, das folgende Skript zu verstehen. Es wird davon ausgegangen, dass die Namen jeder generierten Datei dem Muster FileN entsprechen (wobei N eine Zahl ist).

@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

Ja, es ist möglich, aber die Methode zu vermeiden, EOL vor EOF prionting ist ein bisschen schwierig. Suchen Sie nach der Lösung bei ss64.com oder dostips.com. – jsxt

+0

Vielen Dank! Sie haben es auf die einfachste Weise beantwortet. Ich habe nicht nur gelernt, wie man den jq-Ausdruck verwendet, sondern auch, wie man die Batch-Datei verwendet, um sie im Fenster zu erreichen. Nur 2 Fragen obwohl ..Ich sehe ein neues Zeilenzeichen am Ende jeder Datei. Ist es möglich, es zu entfernen? Außerdem wird die Eingabeaufforderung beendet, wenn ich eine riesige Datei mit ~ 2000 Zeilen übergebe. Scheint ein Problem mit jq pipe zu sein? Selbst wenn ich einen absoluten Pfad übergeben habe - c: \ cli \ input.json, hat es nicht geholfen. – Dwarrior

+0

Danke für die Antwort auf den 1. Teil. Eigentlich habe ich es mit der 2. Frage aktualisiert. Ich habe Ihre Antwort akzeptiert, aber lassen Sie mich wissen, wenn ich einen weiteren Beitrag für den jq-Absturz erstellen muss. Ich habe unten Link verwiesen, aber hat nicht geholfen. https://stackoverflow.com/questions/45613545/jq-crashingunder-windows-10-using-any-command – Dwarrior

0

Da Sie jq in Ihrer Umgebung haben, scheint es vernünftig anzunehmen, dass Sie awk auch ohne zu große Schwierigkeiten verwenden könnten. Wenn ja, könnten Sie Rohr die JSONLines Ausgabe von jq (mit der Option -c aufgerufen) zu einem awk entlang der folgenden Zeilen:

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