像数组一样索引到 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
索引数组以获得第一行的年龄。
我正在从各种 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
索引数组以获得第一行的年龄。