像数组一样索引到powershell Import-Csv行

时间:2015-02-03 10:56:01

标签: powershell csv

我从各种csv文件导入数据,通常有4或5个字段。

e.g。一个可能看起来像:

id, name, surname, age

1,tom,smith,32

2,fred,bloggs,50

我设法抓住标题行标题和数组看起来像:

id, name, surname, age

第一个数据行如下:

@{ID=1; name=tom; surname=smith; age=32}

说我将其分配给$myRow 我希望能够做的是通过索引,0,1,2等访问$myRow中的ID,名称等字段,而不是通过属性名称。

这可能吗?

由于

3 个答案:

答案 0 :(得分:1)

您可以执行类似的操作,但对于大型行和/或属性集可能会很慢:

$users = 
import-csv myusers.csv |
foreach {
 $i=0
 foreach ($property in $_.psobject.properties.name)
   {
    $_ | Add-Member -MemberType AliasProperty -Name $i -Value $property -passthru
    $i++
   }
 }

这只是为对象

中的每个属性名称添加了一个Alias属性

答案 1 :(得分:0)

当我想做类似的事情时,我采取了不同的方式。 我使用Import-Csv将内容放入表中。然后我逐行遍历表,并使用内部循环将字段值逐个检索到与列名相同的变量。

这创建了一个上下文,我可以将值应用于某种模板中嵌入的变量。这是代码的编辑版本。

foreach ($item in $list) {
   $item | Get-Member -membertype properties | foreach {
      Set-variable -name $_.name -value $item.$($_.name)
      }
   Invoke-expression($template)  >> Outputfile.txt
   }

我正在将扩展的模板写入输出文件,但您明白了。这最终会像邮件合并一样将邮件列表应用于套用信函。

我不会将这种方法用于超过几百行和十几列。它变慢了。

说明:

  

内循环需要更多解释。 $ line是一个包含的表   导入的csv文件的图像。 $ item是此表中的一行。   Get-Member从该行获取每个字段(称为属性)。每   字段有名称和值。 $ .name提供的名称   当前领域。 $ item。($ .name)提供了价值。设置变量   创建一个变量。创建相同的效率非常低效   表中每一行的反复变量,但事实并非如此   在意。

此片段是从较大的片段中剪切的,该片段导入列表和模板,为列表中的每个项目生成模板的扩展,并将一系列扩展输出到文本文件中。我没有包括整个片段,因为它距离被问到的问题太远了。

答案 2 :(得分:0)

实际上,您可以使用($MyRow[1]).age为数组建立索引,以获取第一行的年龄。