【问题标题】:How To Get The Value Of Header In CSV如何在 CSV 中获取 Header 的值
【发布时间】:2014-11-04 00:57:54
【问题描述】:

在 PowerShell 中,我想将 CSV 文件中的标头名称传递给 PowerShell 脚本中的另一个函数。

如何将标头名称的值文本检索到 CSV 中的变量中?

例如如果我有以下 CSV 数据:

ID Name     Country
-- ----     -------
1  John     United States
2  Beatrice Germany
3  Jouni    Finland
4  Marcel   France

在上面的示例中,如何将 Country 列值文本作为“Country”文本检索到脚本中的变量中?

(注意:我熟悉符号 $_.Country 以通过在 Powershell 中导入 CSV 从一行中检索例如“德国”的值)

我的具体问题是目前我的脚本中有以下功能:

function GetItemIdFromTitle([string]$LookupTitle, [ref]$LookupId)
{   
    $LookupField = $LookupList.Fields["DEPTCATEGORY"]   
    $LookupItem = $LookupList.Items | where {$_['DEPTCATEGORY'] -like "*$LookupTitle*"} 
    $LookupId.Value = $LookupItem.ID
}

这当前采用字符串值 -> $LookupTitle 并使用它在 SharePoint 列表中查找项目。正如您在脚本中看到的那样,我在列名中硬编码为“DEPTCATEGORY”。这是将在 SharePoint 列表中查找的列名称。

我不想对列名进行硬编码,而是为相应的 $LookupTitle 值传入列名,并替换硬编码的“DEPTCATEGORY”。

我是这样调用上面的函数的:

#GET THE LOOKUP COLUMN ID       
GetItemIdFromTitle $_.DEPTCAT ([ref]$LookupIdValue)

($_.DEPTCAT 是 CSV 列中的行中的值。)

我可以做类似的事情

$myCountryColumnName = $_.Country.Property.Title 

$myCategoryColumnName = $_.DEPTCAT.Property.Name

从 CSV 中获取列名?

【问题讨论】:

    标签: powershell csv sharepoint-2010


    【解决方案1】:

    如果您要检查数组中是否存在标头名称,请使用以下代码

    $Array | Get-member -MemberType 'NoteProperty'| where {$_.Name -eq "ColumnName"}
    

    【讨论】:

      【解决方案2】:

      假设您已经使用Import-CSV 读取了 CSV,您可以检查结果对象的属性。类似于this answer,但在结果数组中保持列顺序

      检查第一行/元素

      $data = import-csv $path
      $data[0].psobject.properties.name
      

      所以第二行将返回一个属性的字符串数组。

      【讨论】:

      • 这比@ojk 的响应要好,因为它更有效并减少了 cpu 周期。谢谢!
      【解决方案3】:

      这更像是一般性评论而不是答案。

      我需要从 CSV 中提取第一个列标题名称,然后从 Get-Member 中选择 NoteProperty 字段。这不起作用,因为 NoteProperty 列标题名称的顺序可能与 CSV 文件中列标题的顺序不匹配。

      futureSPQR 的方法每次都会起作用,因为文本不会在您身上重新排序。下面是我获取第一列标题名称的方法的单行版本。

      ((Get-Content filename.csv)[0] -split(','))[0]
      

      【讨论】:

      • 这假定CSV 文件不会有export-csv 默认添加的类型头。如果CSV 没有该类型的标头,那么您就可以了:)
      【解决方案4】:

      要从 csv 中获取列名,首先,将列标题的名称放入一个数组中(如果需要,这也允许您遍历每一列)...

      $inFilePath = "C:\path\to\file.csv"
      $csvColumnNames = (Get-Content $inFilePath | Select-Object -First 1).Split(",")
      

      ... ,其次,按列位置索引到数组中(索引从 0 开始)。鉴于您的原始示例,它将是;

      $myCountryColumnName = $csvColumnNames[2]
      

      【讨论】:

      • 请注意,此解决方案不符合 RFC-4180。如果 CSV 中有包含逗号的转义文本,它将中断。 tools.ietf.org/html/rfc4180
      【解决方案5】:
      $f = Import-Csv "...csv"
      
      Get-Member -InputObject $f[0] |
        Where-Object {$_.MemberType -eq "NoteProperty"} |
        select-object Name
      

      【讨论】:

        【解决方案6】:

        如果你在 $obj 中有一个对象,你可以像这样列出所有的属性头:

        $obj | Get-member -MemberType 'NoteProperty' | Select-Object -ExpandProperty 'Name'
        

        这是一个数组,因此您可以像这样单独引用它们:

        ($obj | Get-member -MemberType 'NoteProperty' | Select-Object -ExpandProperty 'Name')[0]
        

        这只会给你例如第一个属性的名称。

        【讨论】:

        • 我正在遍历 CSV 中的行,因此我需要获取行中适当值的列名,然后将列名传递给函数。
        • 我真的不明白你想要做什么。如果您正在遍历行并访问值,则需要属性名称来执行此操作。你能给我一个例子,更详细地说明你正在尝试做什么吗?
        • 试试修改后的答案
        • 我在我的问题中添加了一个更具体的示例。
        • 好的,所以您基本上是想从属性值中查找属性名称?我不确定这是否可行,我也不明白你为什么需要它。在您的一个示例中:$myCountryColumnName = $_.Country.Property.Title 有问题的属性名称是 Country,但是您已经拥有它,因为您在 $_.Country 中使用它,那么为什么不能只使用 $myCountryColumnName = 'Country'
        猜你喜欢
        • 2014-02-19
        • 1970-01-01
        • 2016-10-01
        • 2012-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-17
        • 1970-01-01
        相关资源
        最近更新 更多