2016-11-16 1 views
0

フォルダ内のファイル数を4つのグループに分けるスクリプトを開発しています。これらは4つのバッチファイルに変換されますが、問題はできるだけ均等に分割することです。vbscriptは4つのグループにファイルを分割します

以下のスクリプトは、4を均等に分割するカウントを持っていても、奇数の場合は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を介してアクセス可能です。数字による分布(モジュロと考える)には余分なカウンターが必要です。デモスクリプト:

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

あなたは違った、あなたのループを構築することができます。

各XファイルのBバッチに分割する必要があるFファイルがあります。二つのことが起こることができる:

  1. F、Bの正確な倍数である場合にはX = F/B
  2. Fが+、この場合X =(F/B)において、Bの正確な倍数ではありません1

そこで我々は(一緒に)Fに1から数えるという二つのループを書くことができます:

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 
関連する問題