索引到powershell导入Csv行,就像数组一样
我从各种csv文件导入数据,通常有4或5个字段 e、 g.其中一个可能看起来像:索引到powershell导入Csv行,就像数组一样,powershell,csv,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} 第一个数据行如下所示: id, name, surname, age @{ID=1; name=tom; surname
id, name, surname, age
1,tom,smith,32
2,fred,bloggs,50
我已设法将标题行标题捕获到和数组中,如下所示:
id, name, surname, age
@{ID=1; name=tom; surname=smith; age=32}
第一个数据行如下所示:
id, name, surname, age
@{ID=1; name=tom; surname=smith; age=32}
假设我将其分配给$myRow
我希望能够通过索引、0、1、2等,而不是通过属性名访问$myRow
中的ID、name等字段
这可能吗
谢谢您可以执行类似的操作,但对于大型行集和/或属性集来说可能会比较慢:
$users =
import-csv myusers.csv |
foreach {
$i=0
foreach ($property in $_.psobject.properties.name)
{
$_ | Add-Member -MemberType AliasProperty -Name $i -Value $property -passthru
$i++
}
}
这只是为对象中的每个属性名称添加了一个别名属性当我想做类似的事情时,我的做法不同。 我使用导入Csv将内容放入表中。然后,我逐行遍历该表,并使用内部循环检索字段值,一个接一个地检索到与列名同名的变量中 这创建了一个上下文,我可以在其中将值应用于某种模板中嵌入的变量。下面是代码的编辑版本
foreach ($item in $list) {
$item | Get-Member -membertype properties | foreach {
Set-variable -name $_.name -value $item.$($_.name)
}
Invoke-expression($template) >> Outputfile.txt
}
我正在将扩展模板写入一个输出文件,但你明白了。这最终或多或少会像邮件合并将邮件列表应用于格式信函一样起作用
我不会对几百行和十几列使用这种方法。它变慢了
说明:
内部循环需要更多的解释$list
是一个包含
导入的csv文件的图像<代码>$item是此表中的一行。
Get Member
从该行获取每个字段(称为属性)。每个
字段具有名称和值$\uux.name
传递
当前字段<代码>$item.($\u.name)传递值<代码>设置变量
创建一个变量。创造同样的环境是非常低效的
对于表中的每一行,重复变量,但我没有
关心
此代码段是从一个较大的代码段中剪切而来的,该代码段导入列表和模板,为列表中的每个项目生成模板的展开,并将一系列展开输出到文本文件中。我没有包括整个代码段,因为它离所问的问题太远了。您可以使用
($MyRow[1])对数组进行索引。age
以获取第一行的年龄。为什么要这样做?您可以使用Get Content
加载该文件,然后在,
上拆分以获取一个值数组,我会试试的,谢谢。如果您想发布一个示例Id,请万分感谢,不知道您是否可以直接访问$\u.psobject.properties.name[0]不,这将为您提供属性名称列表中第一个属性的名称。要实际使用它来访问对象的属性值,您必须像这样做:$\.$($\.psobject.properties.name[0])我发现使用$\.psobject.properties.value[0]给了我想要的,所以感谢您的回答。我会将此标记为我使用过的代码。这是演示如何使用别名功能的好答案。由于我对powershell的了解有限,我并不真正理解此代码。这个语法让我困惑:$item.$($.name)
什么是调用Expresison
,$template
是从哪里出现的?感谢您的回复。我对Powershell的理解也非常有限。我掌握了很多早期的技术,所以我的学习曲线可能会有所不同。我将对答案进行编辑以提供解释。在过去的五年中,我改变了我处理这个问题的方式。我不再使用Invoke表达式,而是使用ExpandString$上面示例中的模板来自代码段之外的代码。整个工具可能比代码片段更容易解码。如果您对我为处理多个CSV文件而构建的工具感兴趣,我已经发布了它。张贴在那里的代码不容易阅读,对此我深表歉意。在外部管道和两个内部管道中,我使用%作为“foreach”的缩写,使用$作为“当前对象”的缩写。