2016-11-16 1 views
0

Я разрабатываю скрипт, чтобы разделить количество файлов в папке на четыре группы. Они будут преобразованы в четыре пакетных файла, но на данный момент проблема делит их как можно более равномерно.vbscript делить файлы на четыре группы

Сценарий ниже будет работать несколько - если у меня есть граф, который будет разделен на 4 равномерно, но если у меня будет нечетное число, не будет идти и будет меньше четырех. Вы можете запустить скрипт, просто заменив «C: \ 1_SourceData \ Section_16 \» на свой собственный путь к файлам. Если вы отмените комментарий к разделу «Добавить остаток на передний план», это должно было сделать любые дополнительные файлы, например нечетное число, первой партии, но это не совсем работает. Количество файлов в папке будет варьироваться от 1 до 25.

Любая помощь будет оценена по достоинству.

Option Explicit 
Dim fileList : Set fileList = GetFileList("C:\1_SourceData\Section_16\") 
Dim NumOfFiles : NumOfFiles = fileList.Count - 1 
Dim modNumber : modNumber = NumOfFiles/4 
Dim remainder : remainder = NumOfFiles Mod modNumber 

Dim string1 : string1 = "batch" & batchCounter 
Dim string2 : string2 = "" 

'Add remainder to front 
'Dim i : i = 0 
'For i = NumOfFiles - remainder To NumOfFiles 
' string2 = string2 & vbTab & fileList(i) & vbNewLine 
'Next 

Dim batchCounter : batchCounter = 1 
Dim file 
Dim j : j = 0 
For Each file In fileList 
string2 = string2 & vbTab & file & vbNewLine 
    j = j + 1 

If j Mod modNumber = 0 Then 
    WScript.Echo string1 & vbNewLine & string2 
    batchCounter = batchCounter + 1 
    string1 = "batch" & batchCounter 
    string2 = "" 
End If 
Next 

Public Function GetFileList(path) 
Dim objFSO : Set objFSO = CreateObject("Scripting.FileSystemObject") 
Dim fileList : Set fileList = CreateObject("System.Collections.ArrayList") 
Dim InfFolder : Set InfFolder = objFSO.GetFolder(path) 
Dim File 

For Each File In objFSO.GetFolder(path).Files 
    fileList.Add File 
    Next Set GetFileList = fileList 
End Function 

ответ

2

Проблема заключается в следующем: сбор .files доступен только через For Each. «Распределение по числу» (думаю, modulo) нуждается в дополнительном счетчике. Демонстрационный сценарий:

Option Explicit 

ReDim a(3) ' 4 groups/collections 
Dim i 
For i = 0 To UBound(a) 
    Set a(i) = CreateObject("System.Collections.ArrayList") 
Next 
i = 0 
Dim f 
' fake a list of elms accessible via For Each only 
For Each f In Split("a b c d e f g h i j k l m n") 
    a(i Mod 4).Add f ' use Mod to determine the 'bucket' 
    i = i + 1 ' counter needed for Mod 
Next 
For i = 0 To UBound(a) 
    WScript.Echo i, Join(a(i).ToArray()) 
Next 

выход:

cscript 40639293.vbs 
0 a e i m 
1 b f j n 
2 c g k 
3 d h l 
0

Вы можете структурировать цикл по-разному.

Есть файлы F, которые должны быть разделены на B партий X файлов каждый. Две вещи могут случиться:

  1. F является точным кратным B, и в этом случае X = F/B
  2. Р не кратен B, в случае, когда Х = (F/B) + 1

Поэтому мы можем написать две петли, которые (вместе) считать от 1 до F:

Option Explicit 

Const BATCHES = 4 
Const PATH = "C:\1_SourceData\Section_16" 

Dim FSO : Set FSO = CreateObject("Scripting.FileSystemObject") 
Dim fileList : Set fileList = GetFileList(PATH) 
Dim b, i, f, x 

f = fileList.Count 
x = CInt(f/BATCHES) 
If x * BATCHES < f Then x = x + 1 

For b = 0 To BATCHES - 1 
    If (b * x < f) Then WScript.Echo "batch" & (b + 1) 
    For i = b * x To (b + 1) * x - 1 
     If (i < f) Then WScript.Echo vbTab & fileList(i) 
    Next 
Next 

Function GetFileList(path) 
    Dim file 
    Set GetFileList = CreateObject("System.Collections.ArrayList") 
    For Each file In FSO.GetFolder(path).Files 
     GetFileList.Add File 
    Next 
End Function