【问题标题】:Index into powershell Import-Csv row like an array像数组一样索引到 powershell Import-Csv 行
【发布时间】:2015-02-03 10:56:00
【问题描述】:

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

例如可能看起来像:

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、名称等字段,而不是通过属性名称。

这可能吗?

谢谢

【问题讨论】:

  • 为什么要这样做?您可以使用Get-Content 加载文件,然后在, 上拆分以获取值数组
  • 好的,我试试,谢谢。如果您有发布示例的冲动,我将不胜感激

标签: powershell csv


【解决方案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 属性

【讨论】:

  • 谢谢,不知道你是否可以像 $_.psobject.properties.name[0] 一样直接访问
  • 不,这只会让您获得属性名称列表中第一个属性的名称。要实际使用它来访问对象的属性值,您必须这样做: $_."$($_.psobject.properties.name[0])"
  • 我发现使用 $_.psobject.properties.value[0] 给了我想要的东西,所以感谢您的回答。我会将它标记为我使用的那个。
  • 展示如何使用别名功能的好答案。
【解决方案2】:

当我想做类似的事情时,我会以不同的方式去做。 我使用 Import-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 从该行获取每个字段(称为属性)。每个 字段具有名称和值。 $_.name 传递名称 当前领域。 $item.($_.name) 传递价值。 Set-Variable 创建一个变量。创建相同的效率非常低 为表中的每一行一遍又一遍的变量,但我没有 关心。

这个 sn-p 是从一个更大的 sn-p 中剪裁出来的,它导入一个列表和一个模板,为列表中的每个项目生成模板的扩展,并将一系列扩展输出到文本文件中。我没有包括整个 sn-p,因为它离所问的问题太远了。

【讨论】:

  • 到目前为止,我对 powershell 的了解有限,因此我并没有真正遵循此代码。这种语法让我感到困惑:$item.$($_.name) 和 Invoke-Expresison 是什么,$template 是从哪里出现的?感谢您的回复。
  • 我对Powershell的了解也很有限。我掌握了很多早期的技术,所以我的学习曲线可能会有所不同。我将编辑答案以提供解释。
  • 在过去的五年里,我改变了处理这件事的方式。我不再使用 Invoke-Expression,而是使用 ExpandString。上例中的 $template 来自 sn-p 之外的代码。整个工具可能比 sn-p 更容易解码。
  • 如果您对我构建的用于处理多个 CSV 文件的工具感兴趣,我已将其发布在here。那里发布的代码不容易阅读,对此我深表歉意。我在外部管道和两个内部管道中都使用 % 作为“foreach”的简写和 $_ 作为“当前对象”的简写。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-01
    • 2012-06-22
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 2015-10-12
    • 2014-12-24
    相关资源
    最近更新 更多