如何用PowerShell将拆分后的JSON转为NDJSON格式输出?
问题:将NDJSON文件拆分后直接输出NDJSON格式
我已实现NDJSON文件的读取与拆分,但生成的结果是JSON数组格式,想直接输出NDJSON格式,是否无需额外字符串处理?
输入文件(test.json)
{"PERIOD":"2024004","JRNAL_NO":"38115"} {"PERIOD":"2024004","JRNAL_NO":"38115"} {"PERIOD":"2024004","JRNAL_NO":"38115"} {"PERIOD":"2024004","JRNAL_NO":"38115"} {"PERIOD":"2024004","JRNAL_NO":"38116"}
当前使用的PowerShell脚本
$json = (Get-Content C:\Temp\test.json) | ConvertFrom-Json $jnl_list = $json.JRNAL_NO | select -Unique ForEach ($jnl in $jnl_list) { $Array = $json | Where-Object {$_.JRNAL_NO -eq $jnl} $res = ($Array | ConvertTo-Json) $res | Out-File -FilePath .\JNL\$($jnl).json }
当前输出(38115.json)
[ { "PERIOD": "2024004", "JRNAL_NO": "38115" }, { "PERIOD": "2024004", "JRNAL_NO": "38115" }, { "PERIOD": "2024004", "JRNAL_NO": "38115" }, { "PERIOD": "2024004", "JRNAL_NO": "38115" } ]
期望输出
38115.json
{"PERIOD":"2024004","JRNAL_NO":"38115"} {"PERIOD":"2024004","JRNAL_NO":"38115"} {"PERIOD":"2024004","JRNAL_NO":"38115"} {"PERIOD":"2024004","JRNAL_NO":"38115"}
38116.json
{"PERIOD":"2024004","JRNAL_NO":"38116"}
解决方案
可以直接输出NDJSON格式,无需额外字符串处理,只需调整ConvertTo-Json的使用方式:
修改后的PowerShell脚本:
# 逐行读取NDJSON并转换为对象 $jsonEntries = Get-Content C:\Temp\test.json | ForEach-Object { $_ | ConvertFrom-Json } # 获取唯一的JRNAL_NO值 $jnl_list = $jsonEntries.JRNAL_NO | Select-Object -Unique # 确保输出目录存在 $outputDir = ".\JNL" if (-not (Test-Path $outputDir)) { New-Item -ItemType Directory -Path $outputDir | Out-Null } foreach ($jnl in $jnl_list) { # 筛选当前JRNAL_NO对应的条目 $filteredEntries = $jsonEntries | Where-Object { $_.JRNAL_NO -eq $jnl } # 对每个条目单独生成单行JSON,拼接成NDJSON内容 $ndjsonContent = $filteredEntries | ForEach-Object { $_ | ConvertTo-Json -Compress } # 写入文件 $ndjsonContent | Out-File -FilePath (Join-Path $outputDir "$jnl.json") -Encoding utf8 }
关键修改说明
- 避免数组转换:不对整个筛选后的数组执行
ConvertTo-Json,而是对每个对象单独转换,这样不会生成数组包裹的结构 - 单行JSON输出:使用
-Compress参数让ConvertTo-Json输出紧凑的单行JSON,符合NDJSON每行一个JSON对象的要求 - 目录检查:新增输出目录的创建逻辑,防止因目录不存在导致写入失败
内容的提问来源于stack exchange,提问作者anhtle
相关产品推荐
相关产品推荐

