Получить переменную по имени динамической переменной - PullRequest
1 голос
/ 15 декабря 2011

Как получить доступ к данным, импортированным из файла 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.

Я мог бы изменить скрипт так, чтобы он написал другой скрипт, который знает имена столбцов. Это мое единственное решение?

Ответы [ 3 ]

3 голосов
/ 16 декабря 2011

Я думаю, вы хотите это:

[string[]]$headers = $csvdata | gm -MemberType "noteproperty" | 
                        ?{ $_.Name -match "Header [a-zA-Z]$"} | 
                        select -expand Name
$csvdata | select $headers

Выберите заголовки, соответствующие условию (в данном случае, заканчивающиеся символами), а затем получите данные csv для этих заголовков.

0 голосов
/ 16 декабря 2011

Вы можете использовать собственный скрипт для синтаксического анализа csv вручную:

$content = Get-Content "C:\tmp\data.csv"
$header = $content | Select -first 1
$columns = $header.Split(",")
$indexes = @()
for($i; $i -lt $columns.Count;$i++)
{
    # to verify whether string end with letter matches this regex: "[A-Za-z]$"
    if ($column[$i] -match "[A-Za-z]$")
    {
        $indexes += $i
    }
}

$outputFile = "C:\tmp\outdata.csv"
Remove-Item $outputFile -ea 0
foreach ($line in $content)
{
    $output = ""
    $rowcol = $line.Split(",")
    [string]::Join(",", ($indexes | foreach { $rowcol[$_]  })) | Add-Content $outputFile
}
0 голосов
/ 16 декабря 2011

первое (и единственное ... извините), которое пришло мне в голову:

$csvData | % { $_.$(( $csvData | gm | ? { $_.membertype -eq "noteproperty"} )[0].name) }

для получения значений первого столбца и

$csvData | % { $_.$(( $csvData | gm | ? { $_.membertype -eq "noteproperty"} )[1].name) }

для второго столбца и т. Д. *

это то, что тебе нужно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...