2013-04-07 3 views
1

Le code vbs ci-dessous écrit un nombre de mots (entier) pour chaque ligne de chaîne d'un document. Comment créer un tableau dynamique (du nombre de mots de chaque ligne) et additionner les valeurs?Comment créer un tableau dynamique et additionner ses valeurs

Function AddLineNum() 
Dim nLine, sLine, nCount, nLen 

nCount = 0 
Do Until oInStream.AtEndOfStream 
nLine = oInStream.Line 
sLine = oInStream.ReadLine 

'working word count for each line 
nLen = len(sLine) - len(Replace (sLine, " ", "")) +1 

oOutStream.WriteLine nLen 

nCount = nCount + 1 
Loop 
AddLineNum = nCount 

End Function 

Répondre

2

Utiliser des tableaux standards de VBScript, vous pouvez le faire:

totalCount = 0 
arr = Array() 

Do Until oInStream.AtEndOfStream 
    '... 
    wordCount = UBound(Split(sLine)) + 1 

    ReDim Preserve arr(UBound(arr)+1) 
    arr(UBound(arr)) = wordCount 
    totalCount = totalCount + wordCount 

    nCount = nCount + 1 
Loop 

Notez que ReDim Preserve copie le tableau entier à un nouveau tableau, donc cela ne fonctionnera pas bien avec de grands tableaux.

Une alternative serait d'utiliser la classe ArrayList (nécessite .NET):

totalCount = 0 
Set arr = CreateObject("System.Collections.ArrayList") 

Do Until oInStream.AtEndOfStream 
    '... 
    wordCount = UBound(Split(sLine)) + 1 

    arr.Add wordCount 
    totalCount = totalCount + wordCount 

    nCount = nCount + 1 
Loop 
+0

Merci pour la réponse. Je vais essayer d'implémenter votre code. Je posterai si je peux le faire fonctionner. En ce qui concerne la taille du tableau, je travaille avec des listes relativement petites, donc ce ne sera pas un problème. –

2

En plus des propositions de Ansgar (array ReDim, ArrayList), vous pouvez utiliser un dictionnaire:

cscript wcvbs.vbs 
0 217 words according to '\w+' regexp 
1 216 words according to wc.bat (perl) 
2 319 words according to Len Diff 
Dirty details: 
* 2 2 "Option Explicit" 
* 3 1 "" 
* 4 11 "Dim oFS : Set oFS = CreateObject("Scripting.FileSystemObject")" 
* 5 1 "" 
* 6 8 "Dim reWrd : Set reWrd = New RegExp" 
* 7 3 "reWrd.Global = True" 
* 8 3 "reWrd.Pattern = "\w+"" 
* 9 3 "WScript.Echo "0" _" 
* 10 5 " , reWrd.Execute(oFS.OpenTextFile(WScript.ScriptFullName).ReadAll()).Count _" 
* 11 8 " , "words according to '\w+' regexp"" 
* 12 1 "" 
* 13 11 "Dim oWS : Set oWS = CreateObject("WScript.Shell")" 
* 14 10 "Dim oNWS : Set oNWS = New cNWS" 
* 15 3 "WScript.Echo "1" _" 
* 16 10 " , Split(oNWS.clean(oWS.Exec("wc.bat """ & WScript.ScriptFullName & """").StdOut.ReadAll()))(2) _" 
* 17 8 " , "words according to wc.bat (perl)"" 
* 18 1 "" 
* 19 7 "Dim dicWIL : Set dicWIL = CreateObject("Scripting.Dictionary")" 
* 20 11 "Dim tsIn : Set tsIn = oFS.OpenTextFile(WScript.ScriptFullName)" 
* 21 14 "Dim nSum : nSum  = 0" 
* 22 2 "Dim nLine" 
* 23 3 "Do Until tsIn.AtEndOfStream" 
* 24 9 " Dim sLine : sLine = tsIn.ReadLine()" 
* 25 14 " dicWIL(tsIn.Line) = Array(Len(sLine) - Len(Replace(sLine, " ", "")) + 1, sLine)" 
* 26 8 " nSum = nSum + dicWIL(tsIn.Line)(0)" 
* 27 1 "Loop" 
* 28 1 "tsIn.Close" 
* 29 3 "WScript.Echo "2" _" 
* 30 5 " , nSum _" 
* 31 8 " , "words according to Len Diff"" 
* 32 3 "WScript.Echo "Dirty details:"" 
* 33 5 "For Each nLine In dicWIL.Keys" 
* 34 9 " WScript.Echo "*", nLine, dicWIL(nLine)(0), qq(dicWIL(nLine)(1))" 
* 35 1 "Next" 
* 36 1 "" 
* 37 2 "WScript.Quit 0" 
* 38 1 "" 
* 39 13 "Function qq(s) : qq = """" & s & """" : End Function" 
* 40 1 "" 
* 41 7 "Class cNWS ' normalize (trim, reduce) whitespace" 
* 42 4 " Private m_reTrim" 
* 43 4 " Private m_reReduce" 
* 44 5 " Private Sub Class_Initialize()" 
* 45 15 " Set m_reTrim  = New RegExp" 
* 46 10 " m_reTrim.Global = True" 
* 47 9 " m_reTrim.Pattern = "^\w+|\s+$"" 
* 48 13 " Set m_reReduce  = New RegExp" 
* 49 8 " m_reReduce.Global = True" 
* 50 7 " m_reReduce.Pattern = "\s+"" 
* 51 4 " End Sub" 
* 52 5 " Public Function clean(s)" 
* 53 10 " clean = m_reReduce.Replace(m_reTrim.Replace(s, ""), " ")" 
* 54 4 " End Function" 
* 55 3 " End Class" 
+0

Ah, oui. J'ai oublié les dictionnaires. –

+0

Tout cela est nouveau pour moi! Merci d'avoir partagé. J'utiliserai n'importe quel morceau de code que je peux coincer dans un filtre de texte existant. Vous permettra de savoir. –

Questions connexes