如何索引到Hashtables的PSObject数组

时间:2017-01-31 17:50:32

标签: arrays powershell hashtable

我使用导入的CSV在powershell中工作。我有这样的数据集:

  ID            First_Name                              Last_Nam
--              ----------                              --------
2314             Kenny                                   Anderson
21588            Mark                                    Anderson
2547             Ben                                     Andrews
5797             Benjamin                                Armour

除了2000人和更多专栏外。目前,数据存储为@{ID = "..",First_Name:"..",Last_Name:".."}中的一系列哈希值,并且这些哈希值存储在系统对象数组中。我想将每个哈希存储为数组中的索引。我想在该索引处获取哈希表,但我不知道如何进入System.Object数组。这是我的代码:

$csv = import-csv $csv_name 
$row = @(0)*csv.length
$hash = @{}

for($i =0; $i -lt $csv.length; $i++){
$row[$i] += $csv[$i]
}

#error: cannot convert "@{ID : "..", First_Name: "..", Last_Name:".." to Systems.Int32

for($i =0; $i -lt $csv.length; $i++){
$csv[$i].psobject.properties | Foreach { $hash[$_.Name] = $_.Value }

$row[$i]+=$hash
}

#error: Cannot convert systems.collections.hashtable into Systems.Int32

我正在寻找一种索引数组的方法,以便我可以在该索引处获取哈希表。第一个,指向可通过数组访问的哈希表,我认为最容易操作。如果只是从System.Object []本身获得特定哈希表的更简单方法,请告诉我。

我应该补充一点,我事先不知道列的名称或数量。

1 个答案:

答案 0 :(得分:3)

Import-Csv的返回值不是[hashtable]的数组,它是[psobject]的数组,其中每列都是属性。

没有必要构建任何类型的数组来通过索引获取单个对象。

$csv = import-csv $csv_name 
$csv[0]
$csv[1].First_Name
# etc

您的代码中的错误与您提出的问题无关;你试图将对象添加到数组时遇到错误,因为你实际上是在尝试将对象或哈希表添加到整数类型的现有数组元素中。

您不需要使用一堆零来预先创建数组,因此不需要此行:

$row = @(0)*csv.length

相反,您可以创建一个空数组:

$row = @()

然后,你可以添加到数组本身:

$row += $hash