使用powershell将带有特殊字符的单行JSON转换为多行



主要任务是提取保存在一个文件中的多个json。文件包含无效json我使用模式来选择第一个JSON的有效部分。然后,当我使用out-file保存它时,将提取的数据保存在一行中。我曾经尝试过convertfrom-json | convert -json,但它不能正确工作。特殊字符消失,JSON看起来很糟糕。关于如何将json从file分解为1,2,3,n,有什么建议吗?Json文件会很有帮助。也许有一个替代的regex +模式方法。

下面的垃圾JSON示例
* 001*
{
"_field1": "data",
"field2": "some_data",
"field3": [],
"field4": "010",
"field5": "somedata",
"field6": "data-data",
"beginning_of_content": {
"field7": "data",
"field8": "data",
"field9": "data",
"Another_contents": [
{
"field10": 10,
"field11": "data",
"field12": "data",
"Includings": [
"497216IWIE@$@*&@",
"98421929847252159z_o"wACCo",
"498214921749217947*&^*&^*SD"
],
"field13": "data"
}
]
}
}
* 002*
{
"_field1": "data",
"field2": "some_data",
"field3": [],
"field4": "010",
"field5": "somedata",
"field6": "data-data",
"beginning_of_content": {
"field7": "data",
"field8": "data",
"field9": "data",
"Another_contents": [
{
"field10": 10,
"field11": "data",
"field12": "data",
"Includings": [
"497216IWIE@$@*&@421421421",
"9842192984725lkdflkdskfjllerr$#$#",
"498214921749217947*&^*&421422"
],
"field13": "data"
}
]
}
}

您可以使用-split与正则表达式将您的文件拆分为它包含的单个JSON文档:

$i = 0
(Get-Content -Raw input.txt) -split '(?m)^\*.+' -ne '' | ForEach-Object {
Set-Content -LiteralPath ('{0:000}.json' -f ++$i) -Value $_.Trim()
}
  • 如果对特殊字符有问题,可以根据需要在Get-ContentSet-Content后面添加-Encoding参数;请注意,PowerShell永远不会保留输入编码,所以即使一个文件已经被正确地读取了给定的编码,Set-Content将使用它的默认编码,在PowerShell (Core) 7+中是无bom的UTF-8,而在Windows PowerShell中是系统的传统ANSI代码页。

  • 注意-f操作符的使用是为了产生左零填充的文件名,如001.json,002.json,以便词法排序也反映数字顺序。

最新更新