PowerShell从CSV创建交错数组时遇到问题求助
问题分析
你的代码存在几个关键问题:
- 未初始化
$Devices数组,直接通过索引赋值会引发空引用错误 for循环中使用$_无效,$_仅在管道(如ForEach-Object)中代表当前对象,这里应该用$deviceImport[$i]访问当前行- 错误使用
+=赋值,交错数组需要先创建子数组再添加到主数组
解决方案
如果你需要将每行数据的指定字段(如Id和Name)作为单独子数组存入交错数组,可使用以下代码:
# 导入CSV数据 $deviceImport = Import-Csv ".\ValidatedData.csv" # 初始化存储交错数组的变量 $Devices = @() # 遍历每一行数据 foreach ($device in $deviceImport) { # 将当前行的指定字段创建为子数组,添加到主数组 $Devices += @($device.Id, $device.Name) }
如果需要保留每行的所有字段作为子数组,可改为:
$deviceImport = Import-Csv ".\ValidatedData.csv" $Devices = @() foreach ($device in $deviceImport) { # 将当前行的所有属性值提取为数组 $rowArray = $device.PSObject.Properties.Value $Devices += ,$rowArray # 逗号确保将数组作为单个元素添加,而非展开 }
关键说明
- 使用
foreach循环比for循环更直观,无需手动处理索引,避免索引错误 - 用
,$rowArray的方式添加子数组,能确保子数组作为交错数组的一个元素存在,而不是将子数组的元素展开到主数组中 - 对于20000行数据,这种方式效率足够,若追求极致性能可预先指定数组大小:
$Devices = New-Object 'System.Object[][]' $deviceImport.Count,再通过索引赋值
内容的提问来源于stack exchange,提问作者Broc Christensen
相关产品推荐
相关产品推荐

