首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理异构数组的(成员)

处理异构数组的(成员)
EN

Stack Overflow用户
提问于 2016-03-12 13:03:39
回答 1查看 149关注 0票数 1

让我们创作书籍

代码语言:javascript
复制
$a = New-Object –TypeName PSObject
$a | Add-Member –MemberType NoteProperty –Name Title –Value "Journey to the West" 
$a | Add-Member –MemberType NoteProperty –Name Price –Value 12

$b = New-Object –TypeName PSObject
$b | Add-Member –MemberType NoteProperty –Name Title –Value "Faust" 
$b | Add-Member –MemberType NoteProperty –Name Author –Value "Goethe"

$array1 = $a,$b
$array2 = $b,$a

现在让我们显示这两个数组

代码语言:javascript
复制
PS D:\Developpement\Powershell> $array1

Title               Price
-----               -----
Journey to the West    12
Faust                    

PS D:\Developpement\Powershell> $array2

Title               Author
-----               ------
Faust               Goethe
Journey to the West

因此,据我所知,这基本上意味着powershell认为数组的属性是它的第一个元素的属性(事实上,这甚至不是真的,因为如果第一个元素是$null,那么下一个元素将被考虑)。这也意味着:

  • 如果在数组上调用Get-Member,则只会获得第一个元素的成员
  • 如果在数组上调用Convert-ToCvs,则只为第一个元素定义的属性导出属性值。

我很难理解这背后的原因,这种行为让我在powershell中使用异构数组时感到非常痛苦。

我想从各种外部源导入数据,处理它们,然后将它们导出到cvs文件中。项目是相似的,但它们中的大多数都忽略了一些无法预料的属性。在Powershell中,有什么明显的方法可以在不重新编程的情况下处理这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-12 13:48:37

这是必须的方式,因为PowerShell使用管道。当你跑到前任的时候。$array1 | Export-CSV ....,PowerShell在第一个对象到达时就开始写入CSV文件.此时,它需要知道头文件的样子,因为它是csv文件中的第一行。因此,PowerShell必须假定第一个对象的类/属性表示管道中所有剩余的对象。Format-Table和类似的命令也是如此,它们需要在输出任何对象之前设置样式/视图。

通常的解决方法是使用Select-Object手动指定标头。它将向所有值为$null的对象添加所有缺失的属性。这样,所有的对象都被发送给了前妻。Export-CSV将定义所有相同的属性。

要获取标头,需要从数组中的所有对象接收所有唯一的属性名。例如。

代码语言:javascript
复制
$array1 |
ForEach-Object { $_.PSObject.Properties} |
Select-Object -ExpandProperty Name -Unique

Title
Price
Author

然后,在将对象发送到Select-Object -Properties Title,Price,Author Ex之前,可以将其指定为使用Export-CSV的头:

代码语言:javascript
复制
$a = New-Object –TypeName PSObject
$a | Add-Member –MemberType NoteProperty –Name Title –Value "Journey to the West" 
$a | Add-Member –MemberType NoteProperty –Name Price –Value 12

$b = New-Object –TypeName PSObject
$b | Add-Member –MemberType NoteProperty –Name Title –Value "Faust" 
$b | Add-Member –MemberType NoteProperty –Name Author –Value "Goethe"

$array = $a,$b

$AllProperties = $array |
ForEach-Object { $_.PSObject.Properties} |
Select-Object -ExpandProperty Name -Unique

$array | Select-Object -Property $AllProperties | Export-CSV -Path "mycsv.out" -NoTypeInformation

这将创建这个CSV-文件:

代码语言:javascript
复制
"Title","Price","Author"
"Journey to the West","12",
"Faust",,"Goethe"

如果您有多个数组,您可以像下面的$array = $array1 + $array2那样组合它们

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35957974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档