将json拆分为windows中的多个文件

时间:2017-08-16 03:55:10

标签: windows batch-file aws-cli jq

我正在尝试将我的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循环时,它只给我}

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

echo Array: %array_value%

有人可以指导我如何使用for循环获得相同的命令提示输出吗?

2 个答案:

答案 0 :(得分:0)

由于你的环境中有jq,假设你也可以毫不费力地使用awk似乎是合理的。如果是这样,您可以沿着以下行将jq的jSONLines输出(使用-c选项调用)传递给awk命令:

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

答案 1 :(得分: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!
)