读取txt文件并将所有单词放入字典

时间:2015-04-24 10:35:42

标签: dictionary vbscript wsh

到目前为止,我一直在创建一个可以读取.txt文档的VBScript,然后将每个单词作为键放入。

如果我们说"你好"在文本中出现10次我希望值为10。 如果它是一个大或小的字母也不重要。喜欢"你好/你好"或者如果有的话。 ,? !在这个词的最后。

示例:

  

"一旦有了一个小孩,孩子就独自一人在世界上了!"

这里我希望输出为。

Key:   Value:
Once:    1
There:   1
Was:     1
A:       1
Little:  1
Child:   2
The:     1

等等。

现在我被困在那个用键和值进入字典的部分。 如果单词出现不止一次我想检查单词是否存在,如果不存在,则创建密钥并给出值1.如果它已经存在,则递增该值。

Const ForReading = 1

Dim strcontents
Dim objfile
dim Place
Dim dictPerson

Set  dictPerson  = CreateObject("Scripting.Dictionary")

Place = InputBox("File Place","Place:",     "C:\text.txt") 

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(Place, ForReading)
strContents = objFile.ReadAll
objFile.Close

i = i + 1

arrLines = Split(strContents, " ")

For Each strLine in arrLines
  'WScript.Echo (strline) 
Next

编辑:

这是我的结局代码?

我给了我一个"错误"输出

 Option Explicit 
 Const ForReading = 1

 Dim DictPerson
 Dim Placering
 Dim OBJFile
 Dim OBJFSO
 Dim Strcontents
 Dim Arrlines
 Dim StrLine
 Dim Re
 Dim Word
 Dim list
 Dim Key
 list = ""

 Set DictPerson = CreateObject("Scripting.Dictionary")
 DictPerson.CompareMode = vbTextCompare

 Placering = InputBox("Indtast Placering på filen!","Placering:",           "C:\Users\TEV-E311\Desktop\Eksamen\olsenbanden.txt") 

 Set OBJFSO = CreateObject("Scripting.FileSystemObject")
 Set OBJFile = OBJFSO.OpenTextFile(Placering, ForReading)
 Strcontents = OBJFile.ReadAll
 OBJfile.Close


 Arrlines = Split(Strcontents, " ")


 Set Re = New RegExp
     Re.Pattern = "^(.*)[.:,;!?-]$"

 For Each StrLine In Arrlines
    For Each Word In Split(StrLine)
        Word = Re.Replace(Word, "$1")
        DictPerson(Word) = DictPerson(Word) + 1
    Next    
 Next

            For Each key In dictPerson.Keys
            list = list & key & ":" & vbTab & dictPerson(key) & vbNewLine
            Next

这看起来是否正确?

输出的第一行是孔线而不是2个第一个字? (在第一行它说Egon Olsen)在我的输出中它也说Egon Olson?

输出:

Microsoft(R)Windows Script Host版本5.8 版权所有(C)Microsoft Corporation 1996-2001。 Alle rettigheder forbeholdes。

 Egon:  2
 Olsen
 Jeg:   1
 har:   6
 Han:   1
 var:   3
 aldeles:   1
 svensker:  1
 han:   1
 bare:  1
 almindelig:    1
 fuld
 Benny: 1
 Frandsen
 Skide: 1
 godt:  1
 Egon!
 Egon:  1
 fanden.
 Den:   1
 go':   1
 nok:   1
 Egon!
 Hva':  1
 faan:  2
 sgu:   1
 fyldt: 1
 femmer!
 så:    1
 rolig: 1
 nu:    3
 Egon
 "Gode: 1
 gamle: 1
 Franz.
 Hva´:  1
 taget: 1
 røven: 1
 dig:   2
 igen:  1
 ?
 Så:    1
 Keld:  1
 jo:    3
 ment
 Du:    1
 smælderfed:    1
 mand!
 Yvonne:    1
 Jensen
 Der:   1
 kommer:    2
 et:    1
 tidspunkt: 1
 enhver:    1
 kvindes:   1
 liv:   1
 hvor:  1
 hun:   1
 må:    1
 blomstre:  1
 folde: 1
 sig:   1
 ud.
 Nej.:  1
 siger: 1
 Egon.
 Ja,:   1
 Vorherre:  1
 bevares.
 Du:    1
 lovede:    1
 skulle:    1
 millionærer.
 Meget: 1
 du:    1
 budt:  1
 gennem:    1
 alle:  1
 disse: 1
 år.
 ..og:  1
 når:   1
 vores: 1
 alder: 1
      kun:  1
 resten:    1
 livet: 1
 tilbage.
 :  1


 ***** script completed - exit code: 0 *****

这只是代码中的一部分,因为有363个单词。 但正如你可以看到它为Hello和你好做一个Key(例子)?即使是同一个词?

并且它会删除。,?!从一些话?  +在第一行,它使Egon Olsen成为一个单词?我在那里做错了什么?

如果有人想要文本我也可以上传,但它是丹麦语.... :)

1 个答案:

答案 0 :(得分:3)

每行

Split,删除尾随标点符号,然后将单词添加到词典中:

Set re = New RegExp
re.Pattern = "^(.*)[.:,;!?´-]+$"

For Each strLine In arrLines
  For Each word In Split(strLine)
    word = re.Replace(word, "$1")
    dictPerson(word) = dictPerson(word) + 1
  Next
Next

将字典的CompareMode属性设置为vbTextCompare会使密钥不区分大小写:

Set dictPerson = CreateObject("Scripting.Dictionary")
dictPerson.CompareMode = vbTextCompare

作为旁注,我建议在循环中使用ReadLine而不是ReadAllSplit

Set objFile = objFSO.OpenTextFile(Place, ForReading)
Do Until objFile.AtEndOfStream
  strLine = objFile.ReadLine
  ...
Loop
objFile.Close

这样你就可以一次处理一行而不是一次读取整个内容,这对于大文件来说可能非常耗费内存。

修改:要显示结果,您可以(例如)执行以下操作:

list = ""
For Each key In dictPerson.Keys
  list = list & key & ":" & vbTab & dictPerson(key) & vbNewLine
Next
WScript.Echo list
相关问题