Powershell循环从导入的CSV读入数组

时间:2018-07-09 23:02:19

标签: powershell

我有一个导入CSV的脚本,然后我将某些值读入数组。

如何使用循环使它变得更好?

ZipFile

3 个答案:

答案 0 :(得分:2)

有几种方法。这是一个:

$array_list = @()
foreach($row in (Get-Content c:\temp\List.csv | Select-Object -Skip 1)){
    $array_list += ($row.split(','))[0..9]
}

如果有不需要的空格或引号,则可能需要稍微调整一下。

如果要基于属性名称执行此操作:

$contents = Import-CSV C:\temp\Test.csv
$propertyNames = gm -in $contents[0] | ?{$_.name -like '*position*'} | select -expand name
$array_list = @()
foreach($row in $contents){
    foreach($name in $propertyNames){
        $array_list += $row.$name
    }
}

答案 1 :(得分:2)

如果的目的是仅提取CSV列中的子集 ,则您 可以简单地使用Select-Object

$array = Import-Csv "c:\temp\list.csv" | Select-Object -Property position*

请注意使用通配符模式选择要提取的属性;匹配的列将按输入顺序进行提取,因此,如果CSV包含该顺序的列position0position1,... position10(可能以不同名称命名列),然后$array(类型为[object[]])中收集的输出包含自定义对象,这些对象具有为这些列命名的属性-按顺序-分别包含行的列值

(当然,您可以显式枚举要提取的列,方法是将它们作为 array 传递给Select-Object -Property(例如Select-Object -Property position4, position 7),甚至可以混合文字参数数组中带有通配符表达式的列名称。)


如果您实际上是要在所有输入行的单一平面数组中收集position*列值 (PSv3 + ):

$array = Import-Csv "c:\temp\list.csv" | Select-Object -Property position* |
  ForEach-Object { $_.psobject.properties.value }

答案 2 :(得分:1)

$fields = 'position1', 'position2', 'position3', 'position4', 
          'position5', 'position6', 'position7', 'position8', 
          'position9', 'position10'


$array = foreach ($line in Import-Csv "c:\temp\list.csv")
{
    $fields | foreach-object {
        $line.$_
    }
}