我对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个项目。
答案 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。那样中断Excel数据的读取,也不需要像选项 3。
this_class_instance