Arrays 如何索引到哈希表的PSObject数组中
我正在powershell中使用导入的CSV。我有这样一个数据集:Arrays 如何索引到哈希表的PSObject数组中,arrays,powershell,hashtable,Arrays,Powershell,Hashtable,我正在powershell中使用导入的CSV。我有这样一个数据集: ID First_Name Last_Nam -- ---------- -------- 2314 Kenny Anderson 21588 Mar
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[]本身获取特定的哈希表,请告诉我
我应该补充一点,我事先不知道列的名称或数量。导入Csv的返回值不是
[hashtable]
的数组,而是[psobject]
的数组,其中每个列都是一个属性
不需要构建任何类型的数组来通过索引获取单个对象
$csv = import-csv $csv_name
$csv[0]
$csv[1].First_Name
# etc
代码中的错误与您提出的问题无关;尝试将对象添加到数组时会出现错误,因为实际尝试将对象或哈希表添加到integer类型的现有数组元素
您不需要用一堆零预先创建数组,因此不需要这一行:
$row = @(0)*csv.length
相反,您可以创建一个空数组:
$row = @()
然后,只需将以下内容添加到阵列本身:
$row += $hash
Import Csv
的返回值不是[hashtable]
s的数组,而是[psobject]
s的数组,其中每一列都是一个属性
不需要构建任何类型的数组来通过索引获取单个对象
$csv = import-csv $csv_name
$csv[0]
$csv[1].First_Name
# etc
代码中的错误与您提出的问题无关;尝试将对象添加到数组时会出现错误,因为实际尝试将对象或哈希表添加到integer类型的现有数组元素
您不需要用一堆零预先创建数组,因此不需要这一行:
$row = @(0)*csv.length
相反,您可以创建一个空数组:
$row = @()
然后,只需将以下内容添加到阵列本身:
$row += $hash
+=
是一种非常糟糕的方法,因为它每次都会重新创建和复制整个数组。正确的方法是1)收集循环输出$arr=foreach(…){…;$element}
或2)ArrayList。你可以自己找到更多的例子。@wOxxOm我看到你也在另一个问题中发布了这个,我认为这不是一个好的建议。在绝大多数情况下,性能对整个任务的影响可以忽略或不明显<代码>+=更具可读性和清晰性,这通常是更可取的特性。了解不同操作方法的性能方面是很好的,但在我看来,说+=
很糟糕,而且不恰当是一种延伸。@briantist,从循环或管道收集输出更简单、更快、更可读、更“华丽”,即使是在小数组的情况下。@wOxxOm可以,具体取决于用例。主张用循环替换+=
的所有实例对我来说太过分了。我尊重你对它的看法,我只是觉得你表达它的方式(+=
是错误的,循环集合是正确的)可能需要一些细微差别。关于字符串连接,你也会这么说吗?因为+
和+=
每次都会重新创建字符串,所以应该始终使用StringBuilder替换它?(严肃的问题,不是修辞性的)@briantist,+=
与string的情况不同:1)它比StringBuilder简单,而数组的情况正好相反(使用循环集合,无需初始化空数组,无需显式添加元素),2)与数组相比,字符串通常更小/更简单,作为基本数据类型的内容复制速度更快。+=
是一种可怕的方法,因为它每次都会重新创建和复制整个数组。正确的方法是1)收集循环输出$arr=foreach(…){…;$element}
或2)ArrayList。你可以自己找到更多的例子。@wOxxOm我看到你也在另一个问题中发布了这个,我认为这不是一个好的建议。在绝大多数情况下,性能对整个任务的影响可以忽略或不明显<代码>+=更具可读性和清晰性,这通常是更可取的特性。了解不同操作方法的性能方面是很好的,但在我看来,说+=
很糟糕,而且不恰当是一种延伸。@briantist,从循环或管道收集输出更简单、更快、更可读、更“华丽”,即使是在小数组的情况下。@wOxxOm可以,具体取决于用例。主张用循环替换+=
的所有实例对我来说太过分了。我尊重你对它的看法,我只是觉得你表达它的方式(+=
是错误的,循环集合是正确的)可能需要一些细微差别。关于字符串连接,你也会这么说吗?因为+
和+=
每次都会重新创建字符串,所以应该始终使用StringBuilder替换它?(严肃的问题,不是修辞性的)@briantist,+=
与string的情况不同:1)它比StringBuilder简单,而数组的情况正好相反(使用循环集合,无需初始化空数组,无需显式添加元素),与数组相比,字符串通常更小/更简单,作为基本数据类型的内容复制速度更快。