使用PowerShell提取混杂文件中多段JSON并格式化多行保存咨询
混杂非JSON内容文件的多段JSON拆分提取方案
问题根源
- 提取内容存为单行:本质是模式匹配时未保留原始文本的换行结构,或是读取文件时未使用全量读取参数吞掉了换行符
ConvertFrom-Json | ConvertTo-Json格式错乱、特殊字符丢失:PowerShell 自带的ConvertTo-Json默认序列化深度仅为2级,嵌套超过2层的数组、对象会被直接截断或转成错误类型,同时默认转义规则与原始JSON的特殊字符处理逻辑存在差异,只要需求是原样提取JSON,完全不需要做序列化/反序列化操作,直接保留原始文本片段存储即可。
推荐实现(括号计数法,无正则匹配误差)
该方案不依赖正则匹配,通过逐字符遍历统计大括号层级定位JSON片段边界,可自动跳过字符串内部的大括号、转义引号、特殊符号,不会被嵌套结构干扰,提取内容与原文件中的JSON格式完全一致,无字符丢失。
以下是可直接运行的PowerShell代码:
# 替换为你的混杂文件实际路径,-Raw参数一次性读取全量原始内容,不做转码 $rawContent = Get-Content -Path ".\mixed_content.txt" -Raw $jsonSegments = @() $braceDepth = 0 $segmentStart = -1 for ($i = 0; $i -lt $rawContent.Length; $i++) { $currentChar = $rawContent[$i] # 跳过转义符关联的后续字符,避免误判转义引号 if ($currentChar -eq '\' -and $i + 1 -lt $rawContent.Length) { $i++ continue } # 跳过字符串包裹的全部内容,避免把字符串内部的{/}识别为JSON结构边界 if ($currentChar -eq '"') { $i++ while ($i -lt $rawContent.Length -and $rawContent[$i] -ne '"') { if ($rawContent[$i] -eq '\') { $i++ } $i++ } continue } # 统计大括号层级,定位JSON起止位置 if ($currentChar -eq '{') { if ($braceDepth -eq 0) { $segmentStart = $i } $braceDepth++ } elseif ($currentChar -eq '}') { $braceDepth-- if ($braceDepth -eq 0) { # 截取完整JSON原始片段 $jsonSegments += $rawContent.Substring($segmentStart, $i - $segmentStart + 1) $segmentStart = -1 } } } # 按顺序输出为独立JSON文件 for ($idx = 0; $idx -lt $jsonSegments.Count; $idx++) { $outputPath = "$($idx + 1).json" # 指定UTF8无BOM编码,-NoNewline避免末尾追加多余空行 $jsonSegments[$idx] | Out-File -FilePath $outputPath -Encoding utf8NoBOM -NoNewline }
方案特点
- 格式完全保留:提取的是原文件中的原始JSON片段,缩进、换行和原内容完全一致,不会出现单行问题
- 内容无丢失:全程不做JSON结构转换,原始内容中的特殊符号、转义字符、嵌套结构100%保留
- 识别准确率高:不受JSON内部特殊字符、转义引号、嵌套层级影响,比正则匹配的容错性高很多
- 无依赖:不需要安装第三方工具,原生PowerShell环境即可运行
注意事项
- 读取文件必须加
-Raw参数,禁止按行读取,避免破坏JSON的连续结构 - 存储时不要使用Out-File的默认编码,指定
utf8NoBOM避免编码乱码 - 不需要修改JSON内容的前提下,绝对不要对提取的片段做
ConvertFrom-Json/ConvertTo-Json转换,这是导致格式错乱的核心原因
内容的提问来源于stack exchange,提问作者Sergey Fajans
相关产品推荐
相关产品推荐

