Как получить доступ к данным, импортированным из файла CSV, используя имена свойств динамической заметки? То есть имена заранее не известны. Они соответствуют шаблону и извлекаются из файла CSV при запуске сценария.
Как пример, рассмотрим файл CSV:
"Header 1","Header A","Header 3","Header B"
0,0,0,0
1,2,3,4
5,6,7,8
Я бы хотел извлечь только те столбцы, которые заканчиваются буквой. Для этого я читаю строку заголовка и извлекаю имена с помощью регулярного выражения, например,
$reader = new-object IO.StreamReader("C:\tmp\data.csv")
$line = $reader.ReadLine()
$headers = @()
$line.Split(",") | % {
$m = [regex]::match($_, '("Header [A-Z]")')
if($m.Success) { $headers += $m.value } }
Это получит все имена столбцов, которые мне нужны:
"Header A"
"Header B"
Теперь, чтобы получить доступ к CSV-файлу, я импортирую его так,
$csvData = import-csv "C:\tmp\data.csv"
Import-CSV создаст пользовательский объект со свойствами в соответствии со строкой заголовка. Доступ к полям можно получить по именам NoteProperty, например,
$csvData | % { $_."Header A" } # Works fine
Очевидно, что для этого нужно заранее знать имя столбца. Я хотел бы использовать имена двоеточий, которые я извлек и сохранил в $headers
. Как бы я это сделал?
Некоторые вещи, которые я пробовал до сих пор
$csvData | % { $_.$headers[0] } # Error: Cannot index into a null array.
$csvData | % { $np = $headers[0]; $_.$np } # Doesn't print anything.
$csvData | % { $_.$($headers[0]) } # Doesn't print anything.
Я мог бы изменить скрипт так, чтобы он написал другой скрипт, который знает имена столбцов. Это мое единственное решение?