概要
ファイル内のJSON配列を逆転させ、別ファイルに出力するPowerShellスクリプトを作ってみました。ポイントは、PowerShellのJSON関連コマンドレットとUnicodeエスケープに対する処理でしょうか。
スクリプト
Reverse-JsonArray.ps1
Param([string]$from, [string]$to)
$data = (Get-Content $from -Raw -Encoding UTF8 | ConvertFrom-Json)
$data = $data[($data.length-1)..0]
[Regex]::Unescape((ConvertTo-Json $data)) | Set-Content -Path $to -Encoding UTF8
使い方
PS > Reverse-JsonArray.ps1 -from input.json -to output.json
入出力共にUTF8に設定してあるので、他のエンコーディングを利用する場合はその辺いじってくださいな。
入力例
input.json
[
{
"group": 1,
"leader": "souji",
"leader_jp": "総司"
},
{
"group": 2,
"leader": "shinpachi",
"leader_jp": "新八"
},
{
"group": 3,
"leader": "hajime",
"leader_jp": "一"
},
{
"group": 4,
"leader": "chuji",
"leader_jp": "忠司"
},
{
"group": 5,
"leader": "kanryusai",
"leader_jp": "観柳斎"
},
{
"group": 6,
"leader": "genzaburo",
"leader_jp": "源三郎"
},
{
"group": 7,
"leader": "sanjuro",
"leader_jp": "三十郎"
},
{
"group": 8,
"leader": "heisuke",
"leader_jp": "平助"
},
{
"group": 9,
"leader": "mikisaburo",
"leader_jp": "三樹三郎"
},
{
"group": 10,
"leader": "sanosuke",
"leader_jp": "左之助"
},
{
"memo": "<>&#/,."
}
]
出力
output.json
[
{
"memo": "<>&#/,."
},
{
"group": 10,
"leader": "sanosuke",
"leader_jp": "左之助"
},
{
"group": 9,
"leader": "mikisaburo",
"leader_jp": "三樹三郎"
},
{
"group": 8,
"leader": "heisuke",
"leader_jp": "平助"
},
{
"group": 7,
"leader": "sanjuro",
"leader_jp": "三十郎"
},
{
"group": 6,
"leader": "genzaburo",
"leader_jp": "源三郎"
},
{
"group": 5,
"leader": "kanryusai",
"leader_jp": "観柳斎"
},
{
"group": 4,
"leader": "chuji",
"leader_jp": "忠司"
},
{
"group": 3,
"leader": "hajime",
"leader_jp": "一"
},
{
"group": 2,
"leader": "shinpachi",
"leader_jp": "新八"
},
{
"group": 1,
"leader": "souji",
"leader_jp": "総司"
}
]
解説
PowerShellのJSON関連コマンドレットが便利、ということで作ってみました。ConvertFrom-JsonやConvertTo-JsonでJSON<->オブジェクト変換が一発でできるのは(・∀・)イイネ!!
ちなみに、最後の行で.NETライブラリのRegex.Unescape
を使っていますが、これがないとmemo
の値がこんな↓になってしまいます。
{
"memo": "\u003c\u003e\u0026#/,."
}
こんな具合に、一部の記号がUnicodeエスケープされて出力されます。出力後のJSONを純粋にデータとして扱う場合、むしろこちらの方がセキュリティ面から考えるといいと思います。が、自分の場合は出力後のJSONを人が読めるものにする必要があったため、Unicodeエスケープを解除しています。