我从各种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,名称等字段,而不是通过属性名称。
这可能吗?
由于
答案 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
为数组建立索引,以获取第一行的年龄。