Преобразование данных с помощью PowerShell - PullRequest
0 голосов
/ 11 декабря 2018

Я был бы признателен за помощь в преобразовании некоторых данных с PowerShell, и я понятия не имею, с чего начать.

Мои данные CSV выглядит так:

System Name | Key   | Value
S1          | cpu   | Xeon ...
S1          | cores | 8
S1          | cpu   | Xeon ...
S1          | cores | 8
S1          | RAM1  | 8
S1          | RAM2  | 8
...
S2          | cpu   | Xeon ...

Что мне нужно, чтобысоздайте таблицу, которая выглядит следующим образом:

System Name | CPUType | CPUs | Cores
S1          | Xeon .. | 2    | 16
S2          | Xeon .. | 1    | 4

Я попробовал вот что:

$csvPath = "C:\Users\rene\Desktop\Report_Machine_Hardware.csv"
$csv = Import-Csv $csvPath | Group-Object machineName
$hash = @{}
foreach ($obj in $csv) {

    # Werte pro Server
    $cpuCores = 0
    $cpus = 0
    $cputype = ""



    #$obj | fl

    foreach ($grp in $obj.Group)
    {

        #$grp | fl
        if ($grp.attributeName -eq "NumberOfCores")
        {
            $cpuCores = $cpuCores + [int]$grp.attributeValue
            #write-host $grp.attributeValue
        }

        if ($grp.attributeName -eq "ProcessorId")
        {
            $cpus++
        }

        if ($grp.attributeName -eq "Name")
        {
            $cputype = $grp.attributeValue
        }       


    }

    #Write-Host "Host $($grp.machineName) hat $cpus CPUs mit $cpuCores CPU Cores vom Typ $cputype"

    $out = @($grp.machineName,$cputype,$cpus,$cpuCores)
    $hash.Add($grp.machineName,$out)
}
Export-CSV C:\temp\test.csv -InputObject $hash  -NoTypeInformation 

Для каждой системы я получаю массив с именем системы и моими значениями, но теперь мне нужноприведите каждый отдельный массив в форму списка с заголовком, чтобы снова экспортировать его в csv.Последние 4 строки не работают по мере необходимости.Скорее всего, есть простой способ сделать это, но я думаю, что сейчас у меня есть какой-то ментальный блок.Кто-нибудь может мне помочь, пожалуйста.

С уважением, Рене

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

На основании scepticalist хороший ответ, но
Я бы использовал [PSCustomObject] (PSv3 +) и назначил бы вывод для внешнего ForEach:

## Q:\Test\2018\12\11\SO_53722443.ps1
$csvPath = ".\Hardware.csv"
$csv = Import-Csv $csvPath | Group-Object SystemName

$NewOutput = ForEach ($obj in $csv) {
    $cpuCores = $cpus = $cputype = $Null
    ForEach ($grp in $obj.Group){
        if ($grp.key -eq "cores"){
            $cpuCores += [int]$grp.Value
        }
        if ($grp.key -eq "CPU") {
            $cpus++
            $cputype = $grp.Value
        }
    }
    [PSCustomObject]@{
        SystemName = $grp.SystemName
        CPUType    = $cputype
        CPUs       = $cpus
        CPUcores   = $cpuCores
    }
}
$NewOutput
$NewOutput | Export-CSV .\test.csv -NoTypeInformation
0 голосов
/ 11 декабря 2018

Как и выше - я также думаю, что данные и имена ваших атрибутов в коде не совпадают.

Формат данных:

enter image description here

Попробуйте вместо этого использовать объекты PS и использовать имена атрибутов из csv:

$csvPath = "C:\temp\book1.csv"
$csv = Import-Csv $csvPath | Group-Object SystemName
ForEach ($obj in $csv) {

# Werte pro Server
$cpuCores = 0
$cpus = 0
$cputype = ""



#$obj | fl

$NewOutput = foreach ($grp in $obj.Group)
{
    if ($grp.key -eq "cores")
    {
        $cpuCores = $cpuCores + [int]$grp.Value
        #write-host $grp.attributeValue
    }

    if ($grp.key -eq "CPU")
    {
        $cpus++
        $cputype = $grp.Value
    }
}


#Write-Host "Host $($grp.machineName) hat $cpus CPUs mit $cpuCores CPU Cores vom Typ $cputype"
$data = new-object psobject
$data | add-member @{SystemName = $grp.SystemName;CPUType = $cputype;CPUs = $cpus;CPUcores =$cpuCores}
$data
}
$NewOutput | Select SystemName, CPUType, CPUs, CPUCores | Export-CSV C:\temp\test.csv -NoTypeInformation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...