Powershell脚本将列表分成多个数组

时间:2018-12-20 05:34:31

标签: arrays powershell

我对Powershell非常陌生,我有一个同事帮助我编写的代码。它可以处理少量数据。但是,我将其发送到SAP业务对象查询,该查询仅接受约2000条数据。每个月我必须运行的数据量会有所不同,但通常为7000-8000个左右。我需要更新脚本来遍历数据列表的帮助,以创建一个数组,向其中添加2000个项目,然后再创建具有接下来的2000个项目的新数组,以此类推,直到到达列表末尾为止。

$source = "{0}\{1}" -f $ENV:UserProfile, "Documents\Test\DataSD.xls"

$WorkbookSource = $Excel.Workbooks.Open("$source")
$WorkSheetSource = $WorkbookSource.WorkSheets.Item(1)
$WorkSheetSource.Activate()
$row = [int]2
$docArray = @()
$docArray.Clear() |Out-Null

    Do
    {
        $worksheetSource.cells.item($row, 1).select() | Out-Null
        $docArray += @($worksheetSource.cells.item($row, 1).value())

        $row++
    }
    While ($worksheetSource.cells.item($row,1).value() -ne $null)

因此对于此示例,我将需要脚本来创建4个单独的数组。前三个将有2000个项目,最后三个将有1200个项目。

3 个答案:

答案 0 :(得分:1)

为此,您需要将数据导出到CSV或以其他方式将其提取到包含所有项目的集合中。使用类似StreamReader之类的东西可能会允许更快的处理,但是我从未使用过它。 [脸红]

一旦生成$CurBatch,就可以将其输入所需的任何进程中。

$InboundCollection = 1..100
$ProcessLimit = 22
# the "- 1" is to correct for "starts at zero"
$ProcessLimit = $ProcessLimit - 1

$BatchCount = [math]::Floor($InboundCollection.Count / $ProcessLimit)

#$End = 0
foreach ($BC_Item in 0..$BatchCount)
    {
    if ($BC_Item -eq 0)
        {
        $Start = 0
        }
        else
        {
        $Start = $End + 1
        }

    $End = $Start + $ProcessLimit
    # powershell will happily slice past the end of an array
    $CurBatch = $InboundCollection[$Start..$End]

    ''
    $Start
    $End
    # the 1st item is not the _number in $Start_
    #    it's the number in the array @ "[$Start]"
    "$CurBatch"

    }

输出...

0
21
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

22
43
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44

44
65
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66

66
87
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88

88
109
89 90 91 92 93 94 95 96 97 98 99 100

答案 1 :(得分:0)

这不是100%,但今天晚些时候我会对其进行微调:

$docarray = @{}
$values = @()

$i = 0
$y = 0

for ($x = 0; $x -le 100; $x++) {
    if ($i -eq 20) {
        $docarray.add($y, $values)
        $y++
        $i=0
        $values = @()
    }

    $values += $x
    $i++
}
$docarray.add($y, $values) ## required

$docarray | Format-List

如果限制为2000,则可以将if调用设置为在2000触发。其结果将是x数量的哈希表:

Name  : 4
Value : {80, 81, 82, 83...}

Name  : 3
Value : {60, 61, 62, 63...}

Name  : 2
Value : {40, 41, 42, 43...}

Name  : 1
Value : {20, 21, 22, 23...}

Name  : 0
Value : {0, 1, 2, 3...}

因此,哈希数组中的每个名称都有x个值,该值由if语句上的$ i迭代器表示。

然后,您应该能够通过使用带有哈希数组中每个项目的值的foreach循环将此消息发送到SAP业务对象查询:

foreach ($item in $docarray) {
    $item.Values
}

答案 2 :(得分:0)

为此,有很多选项。 您可以将Excel文件中的所有内容读入一个大数组中,然后将其拆分成较小的块 或者您可以在阅读时将Excel文件的值添加到单独的数组中。
下面的代码就是这样做的。

无论如何,要由您决定实际发送数据的时间。

  1. 立即处理每个数组(将其发送到SAP业务对象 查询),同时从Excel中读取
  2. 将其添加到哈希表中,以便将所有数组存储在内存中
  3. 将其存储在磁盘上以供以后使用

在下面的代码中,我选择第二个选项以读取多个数组中的数据,并将它们保留在哈希表中的内存中。
优点是您不需要像选项 1。那样中断Excel数据的读取,也不需要像选项 3。

this_class_instance