Powershell比较和合并两个数组



我是Powershell的新手,我想做的是比较两个数据数组,然后将它们合并为一个大数组,我可以导出到Excel或POST请求到web服务器使用restful API和json。

在Python中通过使用Pandas和添加搜索数据来做到这一点很简单,但在Powershell中我无法真正完成。

示例:我有两个数组
$a1 = @(('Name1', 'Link1', 'URL1'),
('Name2', 'Link2', 'URL2'),
('Name3', 'Link3', 'URL3')
)
$a2 = @(('Name4', 'URL4', 'TEXT4'),
('Name2', 'URL2', 'TEXT1'),
('Name1', 'URL1', 'TEXT2')
)

我想比较$a1$a2,反之亦然,这样我就不会漏掉任何值

将它们合并在一起,我将得到一个$a3数组,看起来像这样。

$a3 = @(('Name1', 'Link1', 'URL1', 'TEXT1),
('Name2', 'Link2', 'URL2', 'TEXT2),
('Name3', 'Link3', 'URL3', ''),
('Name4', 'URL4', '', 'TEXT4')
)

我越深入研究不同的选择,我就越困惑。

我建议创建一个(至少)简单对象的集合。这几乎是通过公共键组合两组不同属性的经典任务。只需将这些数组的数组转换为带属性的对象的数组,然后将它们组合起来。

请注意,powershell是主要的系统管理员语言,在处理任务时几乎没有任何猜测或机会。

你也可以在PowerShell中使用几乎任何外部。net - dll库(搜索Deedle作为Pandas的替代品)

$a1 = @(('Name1', 'Link1', 'URL1'),
('Name2', 'Link2', 'URL2'),
('Name3', 'Link3', 'URL3')
)
$a2 = @(('Name4', 'URL4', 'TEXT4'),
('Name2', 'URL2', 'TEXT1'),
('Name1', 'URL1', 'TEXT2')
)
# Make Hashtable K=Name;V={Name, Link, Url, Text}
$AObjects = @{}
# Fill Hashtable from A1
@($a1) | 
ForEach-Object { 
$name = $_[0]
$AObjects[$name] = @{
Name = $name
Link = $_[1]
Url  = $_[2]
Text = ''
}
}
# Fill Hashtable from A2
@($a2) | 
ForEach-Object { 
$name = $_[0]
$url  = $_[1]
if (-not $AObjects.ContainsKey($name)) {
Write-Warning "A2 has [$name] that was not listed in A1!"
$AObjects[$name] = @{Name = $name; Url = $url; Link = ''; Text = ''}
} elseif($AObjects[$name].Url -ne $url) {
Write-Warning "For $($name), A1's URL and A2's URL differ! Using A1's"
}
$AObjects[$name].Text = $_[2]
}
# Convert Hashtable to array of objects with props. Select is required for better output.
$AObjects = @($AObjects.Values) | % { [PSCustomObject]$_ } | Select-Object @('Name', 'Link', 'URL', 'Text')
# Convert array of objects with props back to array
$result = $AObjects | 
ForEach-Object {
if ([string]::IsNullOrWhiteSpace($_.Link)) {  # Didn't get your logic swapping elements in example
return @(,@($_.Name, $_.Url, $_.Link, $_.Text))
} else {
return @(,@($_.Name, $_.Link, $_.Url, $_.Text))
}
}
#Print
$result | % { "[$($_ -join ',')]" }
# [Name3,Link3,URL3,]
# [Name1,Link1,URL1,TEXT2]
# [Name2,Link2,URL2,TEXT1]
# [Name4,URL4,,TEXT4]

最新更新