2017-08-16 54 views
0

我想將我的json對象拆分爲多個json數組。將json拆分爲多個窗口中的文件

{ 
    "MusicCollection": [ 
     { 
      "PutRequest": { 
       "Item": { 
        "Artist": {"S": "No One You Know"}, 
        "SongTitle": {"S": "Call Me Today"}, 
        "AlbumTitle": {"S": "Somewhat Famous"} 
       } 
      } 
     }, 
     { 
      "PutRequest": { 
       "Item": { 
        "Artist": {"S": "Acme Band"}, 
        "SongTitle": {"S": "Happy Day"}, 
        "AlbumTitle": {"S": "Songs About Life"} 
       } 
      } 
     }, 
     { 
      "PutRequest": { 
       "Item": { 
        "Artist": {"S": "No One You Know"}, 
        "SongTitle": {"S": "Scared of My Shadow"}, 
        "AlbumTitle": {"S": "Blue Sky Blues"} 
       } 
      } 
     } 
    ] 
} 

下面的命令在linux下將文件分割成多個putRequest數組。

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

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

在命令提示符下直接運行如下命令給了我3個PUT請求。

jq ".MusicCollection[]" music.json 

然而,當我在下面用於批處理腳本循環,它只是給我}

for /f "tokens=*" %%a in ('music.json') do (
     jq ".MusicCollection[]" music.json 
     set array_value=%%a 
    ) 

echo Array: %array_value% 

有人可以請指導我,我應該如何獲得與for循環相同的命令提示符輸出?

+0

從您的問題中不清楚您希望得到什麼結果。你可以這樣做,以便更具體 - 根據你在這個問題中顯示的輸入文件顯示結果文件的內容(或者如果你想要它們中的每一個) – jsxt

+0

I 'm不知道你到底在問什麼,但是...... windows命令提示符沒有變量的數組類型。那是你想要得到的嗎? –

+0

@jsxt:我需要一個o/p在多個文件中。防爆。如果我定義的批量大小爲2,我應該在不同的文件中獲得如下所述的2個json對象。 文件1 {{MusicCollection}:[{「PutRequest」:{「Item」:{「Artist」:{「S」:「No One You Know」},「SongTitle」:{「S」我今天「),」AlbumTitle「:{」S「:」有點着名「}}}},{」PutRequest「:{」Item「:{」Artist「:{」S「:」Acme Band「},文件2:{「MusicReader」:{「S」:「Happy Day」},「AlbumTitle」:{「S」:「 :{「Item」:{「Artist」:{「S」:「No One You Know」},「SongTitle」:{「S」:「害怕我的影子」}「AlbumTitle」:{「S」 「Blue Sky Blues」}}}}]} – Dwarrior

回答

0

這一個允許您分割putRequest設置具有不超過陣列的2項

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

我想這可以幫助你瞭解下面的腳本。它假定生成的每個文件的名稱都與模式FileN(其中N是一個數字)匹配。

@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

是的,這是可能的,但是避免在EOF之前引發EOL的方法有點棘手。在ss64.com或dostips.com上尋找解決方案。 – jsxt

+0

非常感謝!你已經用最簡單的方式回答了它。我不僅學習瞭如何使用jq表達式,還學習瞭如何使用批處理文件在窗口中實現它。儘管只有2個問題..我在每個文件的末尾看到一個新的行字符。是否有可能將其刪除?此外,如果我傳遞大約2000行的大文件,命令提示符會停止。似乎是jq管道的問題?即使我傳遞了絕對路徑 - c:\ cli \ input.json,它也沒有幫助。 – Dwarrior

+0

感謝您回答第一部分。其實,我用第二個問題更新了它。我接受了你的回答,但是讓我知道是否需要爲jq崩潰創建另一個帖子。我提到下面的鏈接,但沒有幫助。 https://stackoverflow.com/questions/45613545/jq-crashing-under-windows-10-using-any-command – Dwarrior

0

既然你在你的環境中有jq,那麼假設你也可以使用awk而沒有太多的困難似乎是合理的。如果是這樣,可以管JQ(與-c選項調用)的JSONLines輸出到awk命令大致如下:

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