Powershell break a long array into a array of array with length of N in one line?

前端 未结 6 1966
梦毁少年i
梦毁少年i 2020-12-18 02:24

For example, given a list 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8 and a number 4, it returns a list of list with length of 4, that is (1, 2, 3, 4), (5, 6, 7, 8),

相关标签:
6条回答
  • 2020-12-18 02:34

    @Shay Levy Answer: if you change the value of a to 1..15 then your solution not working anymore ( Peter Reavy comment )

    So this worked for me:

    $a = 1..15
    $z=for($i=0; $i -lt $a.length; $i+=4){if ($a.length -gt ($i+3)) { ,($a[$i]..$a[$i+3])} else { ,($a[$i]..$a[-1])}}
    $z.count
    
    0 讨论(0)
  • 2020-12-18 02:37
    Clear-Host
    
    $s = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18
    
    $count = $s.Length
    
    $split = $count/2
    
    $split --
    
    $b = $s[0..$split]
    
    $split ++
    
    $a = $s[$split..$count]
    
    write-host "first array"
    
    $b
    
    write-host "next array"
    
    $a
    
    #clean up
    Get-Variable -Exclude PWD,*Preference | Remove-Variable -EA 0
    
    0 讨论(0)
  • 2020-12-18 02:40

    This is a bit old, but I figured I'd throw in the method I use for splitting an array into chunks. You can use Group-Object with a constructed property:

    $bigList = 1..1000
    
    $counter = [pscustomobject] @{ Value = 0 }
    $groupSize = 100
    
    $groups = $bigList | Group-Object -Property { [math]::Floor($counter.Value++ / $groupSize) }
    

    $groups will be a collection of GroupInfo objects; in this case, each group will have exactly 100 elements (accessible as $groups[0].Group, $groups[1].Group, and so on.) I use an object property for the counter to avoid scoping issues inside the -Property script block, since a simple $i++ doesn't write back to the original variable. Alternatively, you can use $script:counter = 0 and $script:counter++ and get the same effect without a custom object.

    0 讨论(0)
  • 2020-12-18 02:45
    $a = 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,0
    $b = 0..([Math]::ceiling($a.Length / 4) - 1) | 
        % {  @(, $a[($_*4)..($_*4 + 4 - 1)]) } 
    

    Don't know why I had to put a comma after (.

    0 讨论(0)
  • 2020-12-18 02:51
    PS> $a = 1..16
    PS> $z=for($i=0; $i -lt $a.length; $i+=4){ ,($a[$i]..$a[$i+3])}
    PS> $z.count
    4    
    
    PS> $z[0]
    1
    2
    3
    4
    
    PS> $z[1]
    5
    6
    7
    8
    
    PS> $z[2]
    9
    10
    11
    12
    
    PS> $z[3]
    13
    14
    15
    16
    
    0 讨论(0)
  • 2020-12-18 02:56

    Wrote this in 2009 PowerShell Split-Every Function

    Probably can be improved.

    Function Split-Every($list, $count=4) {
        $aggregateList = @()
    
        $blocks = [Math]::Floor($list.Count / $count)
        $leftOver = $list.Count % $count
        for($i=0; $i -lt $blocks; $i++) {
            $end = $count * ($i + 1) - 1
    
            $aggregateList += @(,$list[$start..$end])
            $start = $end + 1
        }    
        if($leftOver -gt 0) {
            $aggregateList += @(,$list[$start..($end+$leftOver)])
        }
    
        $aggregateList    
    }
    
    $s = 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8
    
    $r = Split-Every $s 4
    
    $r[0]
    ""
    $r[1]
    ""
    $r[2]
    ""
    $r[3]
    
    0 讨论(0)
提交回复
热议问题