【问题标题】:Read txt file and put all words into an dictionary读取txt文件并将所有单词放入字典
【发布时间】:2015-04-24 10:35:41
【问题描述】:

到目前为止,我一直致力于创建一个可以读取 .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

这看起来正确吗?

输出的第一行是孔线而不是前两个单词? (第一行写着 Egon Olsen)在我的输出中还写着 Egon Olson?

输出:

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

 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 和 hello 创建了一个 Key(示例)?竟然是同一个字?

而且它不会删除 .,?!从一些话? + 在第一行,它把 Egon Olsen 变成了一个词?我在那里做错了什么?

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

【问题讨论】:

    标签: dictionary vbscript wsh


    【解决方案1】:

    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
    

    【讨论】:

    • 非常感谢您对我的帮助,当我现在运行代码时,我得到了。 ***** 脚本已完成 - 退出代码:0 ***** 我错过了什么?我的头都快烧坏了……:P
    • 您或我的代码中没有任何内容会生成这样的输出。你是如何运行脚本的?此外,退出代码 0 通常意味着执行成功完成。有什么不按预期工作吗?如果是这样:您会得到什么结果,它与您预期的结果有何不同?
    • 好吧,我会给你全貌:创建一个脚本,可以计算文本文件中单词的出现次数应用程序必须接收一个参数,即要计算的文件:文本文件= test.txt 程序的示例输出: Well:3 次 Fishmonger:4 次 Hello:2 次 Me:119 次 所以基本上,我希望它计算文本文件中提到的每个单词的数量。提前谢谢我在 VbsEdit(Cscript) 中运行代码
    • 如果您想要输出,您需要添加实际创建输出的代码。您发布的代码没有。
    • 你能给我一个样本来说明你的意思吗?我的根本不行!! P.S:我是菜鸟,所以请多多包涵:P
    猜你喜欢
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 2021-10-13
    • 1970-01-01
    • 2016-08-10
    • 2022-11-19
    相关资源
    最近更新 更多