none
Развернуть хеш таблицу. RRS feed

  • Вопрос

  • Подскажите как развернуть хеш таблицу в powershell быстро и легко?

    Пример. Я создаю хеш таблицу:

    $props = @{}
    $props = @{
    Property1 = "74", "9", "32"
    Property2 = "7", "5", "5"
    Property3 = "1", "4", "6"
    }

    Выводим то, что содержит $props, мы получаем:

    Name                           Value                                                                                                      
    ----                           -----                                                                                                      
    Property1                      {74, 9, 32}                                                                                                
    Property2                      {7, 5, 5}                                                                                                  
    Property3                      {1, 4, 6}   

    Не очень удобно и читабельно. Хочу развернуть и вывести в  виде:

    Property1 Property2 Property3
    74        7         1
    9         5         4
    32        5         6


    • Изменено SergeyOO 7 марта 2017 г. 8:20
    7 марта 2017 г. 8:19

Ответы

  • function Transpose-Data{
        param(
            [String[]]$Names,
            [Object[][]]$Data
        )
        for($i = 0;; ++$i){
            $Props = [ordered]@{}
            for($j = 0; $j -lt $Data.Length; ++$j){
                if($i -lt $Data[$j].Length){
                    $Props.Add($Names[$j], $Data[$j][$i])
                }
            }
            if(!$Props.get_Count()){
                break
            }
            [PSCustomObject]$Props
        }
    }
    
    $props = @{
    Property1 = "74", "9", "32"
    Property2 = "7", "5", "5"
    Property3 = "1", "4", "6"
    }
    
    Transpose-Data $props.Keys $props.Values
    • Помечено в качестве ответа KazunEditor 13 марта 2017 г. 10:07
    7 марта 2017 г. 18:19
  • PS (STA) > @("74", "7", "1"),@("9", "5", "4"),@("32", "5", "6") | %{ [pscustomobject]@{Property1=$_[0];Property2=$_[1];Property3=$_[2]}}
    
    Property1 Property2 Property3
    --------- --------- ---------
    74        7         1
    9         5         4
    32        5         6

    Если из hash, хотя не знаю зачем.

    $props = @{
    	Property1 = "74", "9", "32"
    	Property2 = "7", "5", "5"
    	Property3 = "1", "4", "6"
    }
    $max = (($n = [string[]]$props.Keys) | foreach {$props[$_].Count} | measure -max).Maximum - 1
    0..$max | Foreach {
    	$i = $_
    	$obj = "" | Select $n
    	$n | Foreach {$obj.$_ = $props[$_][$i]}
    	$obj
    }


    • Изменено KazunEditor 7 марта 2017 г. 11:04
    • Помечено в качестве ответа KazunEditor 13 марта 2017 г. 10:07
    7 марта 2017 г. 10:37
    Отвечающий

Все ответы

  • Какой смысл преобразований?

    @("74", "9", "32"),@("7", "5", "5"),@("1", "4", "6") | % {[pscustomobject]@{
    	Property1 = $_[0]
    	Property2 = $_[1]
    	Property3 = $_[2]
    	}
    }
    
    
    
    Property1 Property2 Property3
    --------- --------- ---------
    74        9         32
    7         5         5
    1         4         6

    7 марта 2017 г. 9:03
    Отвечающий
  • Развернуть нужно, по вашему примеру не совсем разворот.
    7 марта 2017 г. 10:26
  • PS (STA) > @("74", "7", "1"),@("9", "5", "4"),@("32", "5", "6") | %{ [pscustomobject]@{Property1=$_[0];Property2=$_[1];Property3=$_[2]}}
    
    Property1 Property2 Property3
    --------- --------- ---------
    74        7         1
    9         5         4
    32        5         6

    Если из hash, хотя не знаю зачем.

    $props = @{
    	Property1 = "74", "9", "32"
    	Property2 = "7", "5", "5"
    	Property3 = "1", "4", "6"
    }
    $max = (($n = [string[]]$props.Keys) | foreach {$props[$_].Count} | measure -max).Maximum - 1
    0..$max | Foreach {
    	$i = $_
    	$obj = "" | Select $n
    	$n | Foreach {$obj.$_ = $props[$_][$i]}
    	$obj
    }


    • Изменено KazunEditor 7 марта 2017 г. 11:04
    • Помечено в качестве ответа KazunEditor 13 марта 2017 г. 10:07
    7 марта 2017 г. 10:37
    Отвечающий
  • 2-й вариант так как нужно. Но нужно в нем разобраться,  не совсем все понятно как он работает. Конструкция сложная.
    • Изменено SergeyOO 7 марта 2017 г. 11:50
    7 марта 2017 г. 11:49
  • function Transpose-Data{
        param(
            [String[]]$Names,
            [Object[][]]$Data
        )
        for($i = 0;; ++$i){
            $Props = [ordered]@{}
            for($j = 0; $j -lt $Data.Length; ++$j){
                if($i -lt $Data[$j].Length){
                    $Props.Add($Names[$j], $Data[$j][$i])
                }
            }
            if(!$Props.get_Count()){
                break
            }
            [PSCustomObject]$Props
        }
    }
    
    $props = @{
    Property1 = "74", "9", "32"
    Property2 = "7", "5", "5"
    Property3 = "1", "4", "6"
    }
    
    Transpose-Data $props.Keys $props.Values
    • Помечено в качестве ответа KazunEditor 13 марта 2017 г. 10:07
    7 марта 2017 г. 18:19