在PowerShell中,我想将CSV文件中的标题名称传递给PowerShell脚本中的另一个函数。
如何将标题名称的值文本检索到CSV中的变量?
e.g。如果我有以下CSV数据:
ID Name Country
-- ---- -------
1 John United States
2 Beatrice Germany
3 Jouni Finland
4 Marcel France
在上面的示例中,如何将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获取列名?
答案 0 :(得分:16)
如果$ obj中有对象,则可以列出所有属性标题:
$obj | Get-member -MemberType 'NoteProperty' | Select-Object -ExpandProperty 'Name'
这是一个数组,所以你可以像这样单独引用它们:
($obj | Get-member -MemberType 'NoteProperty' | Select-Object -ExpandProperty 'Name')[0]
这只会为您提供第一个属性的名称。
答案 1 :(得分:7)
要从csv获取列名,首先,将列标题的名称放入一个数组中(如果需要,这也允许您循环遍历每一列)...
$inFilePath = "C:\path\to\file.csv"
$csvColumnNames = (Get-Content $inFilePath | Select-Object -First 1).Split(",")
...,其次,按列位置索引数组(索引从0开始)。鉴于你的原始例子,它将是;
$myCountryColumnName = $csvColumnNames[2]
答案 2 :(得分:6)
假设您已使用Import-CSV
读取了CSV,则可以检查生成的对象的属性。与this answer类似,但维护结果数组中的列顺序
检查第一行/元素
$data = import-csv $path
$data[0].psobject.properties.name
因此第二行将返回属性的字符串数组。
答案 3 :(得分:1)
这更像是一般性评论而不是答案。
我需要从CSV中提取第一个列标题名称,然后开始从Get-Member中选择NoteProperty字段。这不起作用,因为NoteProperty列标题名称的顺序可能与CSV文件中列标题的顺序不匹配。
futureSPQR的方法每次都会有效,因为文本不会重新排序。下面是我获取第一个列标题名称的方法的单行版本。
((Get-Content filename.csv)[0] -split(','))[0]
答案 4 :(得分:0)
$f = Import-Csv "...csv"
Get-Member -InputObject $f[0] |
Where-Object {$_.MemberType -eq "NoteProperty"} |
select-object Name
答案 5 :(得分:0)
如果您要检查数组中是否存在标头名称,请使用以下代码
$Array | Get-member -MemberType 'NoteProperty'| where {$_.Name -eq "ColumnName"}