PowerShell脚本增强:提取JSON中RatedOI关联的前置ID值
解决PowerShell提取JSON中RatedOI对应实体ID的问题
问题说明
现有PowerShell脚本可正确提取JSON文件中的RatedOI布尔值及上下文,但需要增强功能:捕获与RatedOI同属一个实体的前置ID值(该ID为含4个连字符的36位唯一字符串)。由于ID与RatedOI之间的行数不固定,当前脚本会提取所有ID导致输出冗长带省略号,需修正为仅获取RatedOI所属实体对应的ID。
现有脚本示例
假设现有脚本通过文本匹配逐行处理,会提取所有ID和RatedOI值,但无法关联二者的对应关系:
# 现有脚本 $content = Get-Content -Path "data.json" $allIds = $content | Select-String -Pattern '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}' | ForEach-Object { $_.Matches.Value } $ratedOIMatches = $content | Select-String -Pattern '"RatedOI": (true|false)' | ForEach-Object { $_.Matches.Groups[1].Value } Write-Host "所有ID: $($allIds -join ', ')" Write-Host "RatedOI值: $($ratedOIMatches -join ', ')"
JSON示例
[ { "id": "123e4567-e89b-12d3-a456-426614174000", "name": "Entity A", "details": { "description": "Sample entity with nested properties", "tags": ["foo", "bar"] }, "RatedOI": true }, { "id": "987e6543-e21b-43c2-d109-876543210987", "name": "Entity B", "RatedOI": false }, { "id": "abc123de-f456-7890-ghij-klmnopqrstuv", "name": "Entity C", "metadata": { "created": "2024-01-01" }, "RatedOI": true } ]
修正后的脚本
以下脚本通过逐行遍历跟踪最近的实体ID,确保RatedOI与所属实体的ID准确关联,避免冗余输出:
# 修正后的脚本 $jsonPath = "data.json" $content = Get-Content -Path $jsonPath $currentId = $null # 匹配36位带连字符的UUID正则 $uuidPattern = '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}' # 匹配RatedOI布尔值的正则 $ratedOIPattern = '"RatedOI": (true|false)' foreach ($line in $content) { # 匹配实体ID,更新当前跟踪的ID $idMatch = [regex]::Match($line, $uuidPattern) if ($idMatch.Success) { $currentId = $idMatch.Value } # 匹配RatedOI,输出对应的ID、值及上下文 $ratedOIMatch = [regex]::Match($line, $ratedOIPattern) if ($ratedOIMatch.Success -and $null -ne $currentId) { $ratedOIValue = $ratedOIMatch.Groups[1].Value Write-Host "实体ID: $currentId" Write-Host "RatedOI值: $ratedOIValue" # 提取上下文:输出当前行前后各2行内容 $lineIndex = $content.IndexOf($line) $startIndex = [math]::Max(0, $lineIndex - 2) $endIndex = [math]::Min($content.Count - 1, $lineIndex + 2) $contextLines = $content[$startIndex..$endIndex] -join "`n" Write-Host "上下文内容:`n$contextLines" Write-Host "---" } }
脚本说明
- 核心逻辑:逐行遍历过程中持续跟踪最近出现的实体UUID,当匹配到
RatedOI时,直接使用当前跟踪的ID,确保二者同属一个实体。 - 适配行数不固定的场景:无论ID与
RatedOI之间隔多少行,只要属于同一个实体(JSON对象内),就能准确关联。 - 上下文提取:默认输出
RatedOI行前后各2行内容,可根据需求调整$startIndex和$endIndex的偏移量。 - 灵活适配:如果实体ID的键名不是
"id",只需修改正则表达式(例如'"entityUuid": "([0-9a-f-]{36})"')即可适配不同JSON结构。
内容的提问来源于stack exchange,提问作者BigSmooth82
相关产品推荐
相关产品推荐

