Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何索引到哈希表的PSObject数组中_Arrays_Powershell_Hashtable - Fatal编程技术网

Arrays 如何索引到哈希表的PSObject数组中

Arrays 如何索引到哈希表的PSObject数组中,arrays,powershell,hashtable,Arrays,Powershell,Hashtable,我正在powershell中使用导入的CSV。我有这样一个数据集: ID First_Name Last_Nam -- ---------- -------- 2314 Kenny Anderson 21588 Mar

我正在powershell中使用导入的CSV。我有这样一个数据集:

  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简单,而数组的情况正好相反(使用循环集合,无需初始化空数组,无需显式添加元素),与数组相比,字符串通常更小/更简单,作为基本数据类型的内容复制速度更快。