我有一个导入CSV的脚本,然后我将某些值读入数组。
如何使用循环使它变得更好?
ZipFile
答案 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包含该顺序的列position0
,position1
,... 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.$_
}
}