您可以流式处理文件并处理每一行,对于大文件避免了Get-Content
,并最大限度地减少了cmdlet调用次数:
$allKeys = @{}
[System.IO.File]::ReadLines("names.json") | ForEach-Object {
$obj = ConvertFrom-Json $_
$obj.PSObject.Properties.Name | ForEach-Object {
$allKeys[$_]= $true
}
}
$uniqueKeys = $allKeys.Keys
Write-Output $uniqueKeys
这种方法使用.NET ReadLines
方法来高效地传输文件并处理每一行.
我终于完成了您的海量JSON文件的下载.
- 为了进一步处理JSON,下面是从每一行提取的简单"注解":
$allGlosses = @()
[System.IO.File]::ReadLines("sample.json") | ForEach-Object {
$obj = ConvertFrom-Json $_
$obj.senses.glosses | ForEach-Object {
$allGlosses += $_
}
}
Write-Output $allGlosses
这将为您提供每个JSON对象的注解列表.
反馈回复:
也许使用哈希表来存储唯一密钥,避免不必要地使用ForEach-Object
,并使用完整路径进行文件访问:
$allKeys = @{}
$filePath = Resolve-Path "names.json"
foreach ($line in [System.IO.File]::ReadLines($filePath)) {
$obj = ConvertFrom-Json $line
foreach ($key in $obj.PSObject.Properties.Name) {
$allKeys[$key] = $true
}
}
$uniqueKeys = $allKeys.Keys
Write-Output $uniqueKeys
此代码避免使用+=
增长数组,使用Foreach循环而不是ForEach-Object
,并在.NET方法中使用它之前解析文件路径.