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

Index into powershell Import-Csv row like an array

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

例如一个可能看起来像:

id, name, surname, age

1,tom,smith,32

2,fred,bloggs,50

我已经设法将 header 行标题抓取到数组中,如下所示:

id, name, surname, age

第一个数据行如下所示:

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

说我把它分配给 $myRow 我想要做的是通过索引、0、1、2 等访问 $myRow 中的 ID、名称等字段,而不是通过 属性 名称。

这可能吗?

谢谢

您可以这样做,但对于大量行来说可能会很慢 and/or 属性:

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

这只是为对象中的每个 属性 名称添加一个别名 属性

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

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

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

我正在将扩展模板写入输出文件,但您明白了。这最终或多或少地以邮件合并将邮件列表应用于套用信函的方式工作。

如果超过几百行和十几列,我不会使用这种方法。它变慢了。

解释:

The inner loop needs more explanation. $list is a table that contains the imported image of a csv file. $item is one row from this table. Get-Member gets each field (called a property) from that row. Each field has a name and a value. $_.name delivers the name of the current field. $item.($_.name) delivers the value. Set-Variable creates a variable. It's very inefficient to create the same variables over and over again for each row in the table, but I don't care.

此代码段是从导入列表和模板、为列表中的每个项目生成模板扩展并将扩展系列输出到文本文件中的较大代码段中截取的。我没有包括整个片段,因为它与所问的问题相去甚远。

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