PowerShellで、CSVファイルのヘッダーの名前をPowerShellスクリプトの別の関数に渡したいと思います。
ヘッダー名の値テキストをCSVの変数に取得するにはどうすればよいですか?
例えば次のCSVデータがある場合:
ID Name Country
-- ---- -------
1 John United States
2 Beatrice Germany
3 Jouni Finland
4 Marcel France
上記の例では、Country列の値のテキストを「Country」テキストとしてスクリプトの変数に取得するにはどうすればよいですか?
(注:PowershellにCSVをインポートして、行から「ドイツ」などの値を取得するための$_。Countryという表記に精通しています)
私の特定の問題は、現在、スクリプトに次の関数があることです。
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から列名を取得するには?
$ objにオブジェクトがある場合は、次のようにすべてのプロパティヘッダーを一覧表示できます。
$obj | Get-member -MemberType 'NoteProperty' | Select-Object -ExpandProperty 'Name'
これは配列なので、次のように個別に参照できます。
($obj | Get-member -MemberType 'NoteProperty' | Select-Object -ExpandProperty 'Name')[0]
これにより、たとえば最初のプロパティの名前がわかります。
Import-CSV
を使用してCSVを既に読み込んでいると仮定すると、結果のオブジェクトのプロパティを調べることができます。 この回答 に似ていますが、結果の配列の列の順序を維持します
最初の行/要素を調べる
$data = import-csv $path
$data[0].psobject.properties.name
したがって、2行目はプロパティの文字列配列を返します。
Csvから列名を取得するには、まず、列ヘッダーの名前を配列に入れます(これにより、必要に応じて各列をループすることもできます)...
$inFilePath = "C:\path\to\file.csv"
$csvColumnNames = (Get-Content $inFilePath | Select-Object -First 1).Split(",")
...、次に、列の位置で配列にインデックスを付けます(インデックスは0から始まります)。元の例を考えると、次のようになります。
$myCountryColumnName = $csvColumnNames[2]
これは答えというよりも一般的なコメントです。
CSVから最初の列ヘッダー名を取得する必要があり、Get-MemberからNotePropertyフィールドを選択することから始めました。 NoteProperty列ヘッダー名の順序がCSVファイルの列ヘッダーの順序と一致しない可能性があるため、これは機能しません。
futureSPQRのメソッドは、テキストが並べ替えられないため、毎回機能します。以下は、最初の列ヘッダー名を取得するための彼のメソッドのワンライナーバージョンです。
((Get-Content filename.csv)[0] -split(','))[0]
$f = Import-Csv "...csv"
Get-Member -InputObject $f[0] |
Where-Object {$_.MemberType -eq "NoteProperty"} |
select-object Name