How To Get The Value Of Header In CSV

motionpotion picture motionpotion · Sep 10, 2014 · Viewed 48.8k times · Source

In PowerShell I want to pass the name of a header in a CSV file into another function in the PowerShell script.

How can I retrieve the value-text of a header name into a variable in CSV?

e.g. if I have the following CSV data:

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

In the above example how can I retrieve the Country column value text as "Country" text into a variable in my script?

(Note: I am familiar with the notation $_.Country to retrieve the value of, for example, "Germany" from a row by importing the CSV in Powershell)

My specific issue is that currently I have the following function in my script:

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

This currently takes a string value -> $LookupTitle and uses that to find an item in a SharePoint list. As you can see in the script I am hard-coding in the column name as "DEPTCATEGORY". This is the column name that will be looked up to in the SharePoint list.

Instead of hard-coding the column name I want to pass in the name of the column for the corresponding $LookupTitle value and replace the hard-coded "DEPTCATEGORY".

I am calling the above function as follows:

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

( $_.DEPTCAT is the value from the row in the CSV column. )

Can I do something like

$myCountryColumnName = $_.Country.Property.Title 

or

$myCategoryColumnName = $_.DEPTCAT.Property.Name

to get the column name from the CSV?

Answer

ojk picture ojk · Sep 10, 2014

If you have an object in $obj, you could list all the property headers like this:

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

This is an array, so you can reference them individually like this:

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

This would just give you the name of the first property for instance.