手机
当前位置:查字典教程网 >脚本专栏 >vbs >编写可以打开文本文件并打乱在该文件中所找到的单词顺序的vbs脚本
编写可以打开文本文件并打乱在该文件中所找到的单词顺序的vbs脚本
摘要:问:您好,脚本专家!我女儿有一种闪卡式程序,它能够获取文本文件中的单词列表。我如何编写一个脚本,使其能够打开该文件并自动打乱单词列表的顺序呢...

问:

您好,脚本专家!我女儿有一种闪卡式程序,它能够获取文本文件中的单词列表。我如何编写一个脚本,使其能够打开该文件并自动打乱单词列表的顺序呢?

--SN

答:

您好,SN。您知道,大多数情况下,我们尽力使此专栏关注实际的系统管理任务:我们告诉您如何设置默认打印机、如何禁用服务以及如何映射网络驱动器。不过,有时我们也愿意处理那种听起来就很有趣的问题,而最终的结果有多大用处我们是不会去考虑的。系统管理员通常需要打乱文本文件中单词列表的顺序吗?可能不需要。但是,若是只工作,不玩耍,想必聪明的小孩也会变傻,对不对?

实际上,有些小孩就算玩了也还是有点傻。但这是另外一回事。

明确这一点后,让我们看一下可以打乱文本文件中单词顺序的脚本。正如我们说过的那样,这样的工作在实际当中可能没有一点用处,但它是有点挑战性,并且也确实需要我们使用一点令人感兴趣的脚本编写小窍门。还有,如果不是这样,您可能永远也不会知道这样的窍门何时才能派上用场。

首先,假定您有个类似于下面这样的文本文件,文件中的所有单词按字母顺序排列:

Apple

Banana

Carrot

Dog

Fish

Elephant

Giraffe

Horse

如何才能打乱这些词的顺序呢?使用像下面这样的脚本即可:

复制代码 代码如下:

ConstForReading=1

ConstForWriting=2

SetobjDictionary=CreateObject("Scripting.Dictionary")

SetobjFSO=CreateObject("Scripting.FileSystemObject")

SetobjFile=objFSO.OpenTextFile("c:scriptswords.txt",ForReading)

i=-1

DoUntilobjFile.AtEndOfStream

strLine=objFile.Readline

objDictionary.AddstrLine,strLine

i=i+1

Loop

objFile.Close

DimarrWords()

RedimarrWords(i)

intWordsLeft=i

z=0

DoWhileintWordsLeft>=0

Randomize

rndWord=Int((intWordsLeft-0+1)*Rnd+0)

intWordsLeft=intWordsLeft-1

colItems=objDictionary.Items

strText=colItems(rndWord)

arrWords(z)=strText

z=z+1

objDictionary.Remove(strText)

Loop

SetobjFile=objFSO.OpenTextFile("c:scriptswords.txt",ForWriting)

ForEachstrIteminarrWords

objFile.WriteLinestrItem

Next

objFile.Close

哦,当然,这看起来有些不可思议;确实是件不可思议的差事(至少对系统管理员来讲是这样的)。但是,不管您相信与否,这其中是有逻辑的,我们也将逐步让您明白这种逻辑。

脚本的第一部分确实相当简单。我们定义一对常量-ForReading和ForWriting,我们将在处理文本文件时使用这两个常量。然后创建两个对象:Scripting.Dictionary和Scripting.FileSystemObject。我们将使用Dictionary对象作为从文本文件中所读取单词的临时仓库;而使用FileSystemObject与该文本文件进行实际的交互。

接下来使用OpenTextFile方法打开文件C:ScriptsWords.txt以进行读取。(注意常量ForReading的使用。)下一步,创建一个计数器变量i并将其值设置为-1;我们将使用此变量跟踪文件中的单词数。为什么i要从-1而不是0开始?因为我们要使用i建立一个数组,并且由于数组中的第一项始终为0(而不是1),因此我们需要从-1开始。在我们读取第一个单词时,i将被设置为0,尽管听起来有些奇怪,但是大小为0的数组意味着该数组中包含一个数据项。

嗨,我们只是如实汇报,至于原因我们可不晓得。

接下来是下面这段代码:

复制代码 代码如下:

DoUntilobjFile.AtEndOfStream

strLine=objFile.Readline

objDictionary.AddstrLine,strLine

i=i+1

Loop

我们在这里所做的就是逐行读取文件。对于文件中的每一行(即每个单词),我们将该值赋给一个名为strLine的变量;随后使用Add方法将该值添加到Dictionary对象之中,从而将i值加1。文件读取结束之后,所有的单词都存储在Dictionary对象之中,i的值将为7,这恰好是文件中的单词数减1。(为什么?因为其中含有8项数据的数组的大小为7。)

别担心;到最后您应该会明白其原因所在。

我们希望如此。

关闭文件之后,初始化数组arrWords,设置其大小为i(表示文本文件中的单词数减1)。同时将i值赋给变量intWordsLeft,通过它我们将知道有多少单词要被打乱顺序。最后,将变量z的值设为0;我们将使用z将已打乱顺序的单词填充到数组中。实际上,我们要做的就是从Dictionary中随机取出一个单词然后将其添加到数组中。因为单词是以随机的顺序从Dictionary中取出的,因此它们在数组中的顺序将被“打乱”(以不同的顺序存储)。

现在,到了很有趣的这部分。建立一个Do循环,其一直运行到我们用完Dictionary对象中的所有单词。接着使用下面这两行代码从0和Dictionary对象中数据项的数目(或者至少是数据项的实际数减1,因为Dictionary对象中的第一个数据项为第0项)之间随机选择一个数字:

Ranndomize

rndWord=Int((intWordsLeft-0+1)*Rnd+0)

之后我们将intWordsLeft值减1;这样做是为了始终记住我们现在要处理的单词比之前所处理的少了一个。

那么我们需要这个随机数字做什么呢?我们现在要做的就是使用该值从Dictionary中随机抽取一个单词。为此,我们可以创建一个Dictionary项的集合,然后在变量strText中存储此随机选择的数据项数字的值:

colItems=objDictionary.Items

strText=colItems(rndWord)

换句话说,Banana当前为Dictionary中的第1项。假定在生成随机数字的时候得到的是1。这意味着我们将从Dictionary中将第1项的值取出;然后,也就意味着单词Banana被存储在变量strText中。

明白了吗?从Dictionary中随机取出一个单词之后,我们即需要将该值存储到某个地方。为此我们使用数组arrWords,使strText成为数组中的第一项:

Words(z)=strText

我们如何知道该值应成为第一项?因为我们将该值赋给第z项,而第z项等于0。之后,我们立即将z加1,z将等于1。这也意味着,通过循环下一次我们会将检索到的值赋给数组中的第二项。

单词Banana使用过之后,下一步就是将该单词从Dictionary中删除;否则我们可能会再次使用该单词。要删除此单词,只需调用Dictionary对象的Remove方法,将变量strText作为要删除的项进行传递即可:

objDictionary.Remove(strText)

一切均顺利完成之后,数组arrWords将包含一个从文本文件中所取出的已打乱顺序的单词的列表:

Banana

Elephant

Giraffe

Apple

Fish

Carrot

Horse

Dog

很好,是吧?随后我们只要打开文件Words.txt(这次是进行写入),然后使用已打乱顺序的列表arrWords替换现有内容即可:

复制代码 代码如下:

SetobjFile=objFSO.OpenTextFile("c:scriptswords.txt",ForWriting)

ForEachstrIteminarrWords

objFile.WriteLinestrItem

Next

objFile.Close

下次您的女儿(谁的女儿都一样)运行教育程序的时候,她所看到的将是以随机方式显示的单词。

顺便说一句,我们并没有像人们所谣传的那样对此专栏的文本进行了该脚本的测试。在您好,脚本专家!专栏中的单词可不是随机选择的;每个单词都是我们花了无数的时间进行辛勤的探索和耕耘所得到的。

事实上,就在我们做完所有认真细致的耕耘之后。我们的编辑又将所有单词的顺序随机打乱。如果您能看到该专栏编辑之前的样子,就一定会为它的美妙而吃惊不已!(编辑附注:您看到的会是这种编辑之前的情况:将您吃惊感到。使用不会但是单词这个我“美妙”。)

【编写可以打开文本文件并打乱在该文件中所找到的单词顺序的vbs脚本】相关文章:

用vbs分割与合并文本文件的代码

用vbs实现对文本文件中的项计数

vbs 列出该目录下所有文件和文件夹的类型,大小,和所有者

可以将文件转换为vbs语句的vbs代码

用vbs实现取消隐藏文件夹中的所有文件

VBS 批量读取文件夹内所有的文本到Excel的脚本

VBS打开选择文件对话框代码(Win7)

下载文件到本地运行的vbs

用vbs列出机器上所有能调用的组件

VBS获取当前目录下所有文件夹名字的代码

精品推荐
分类导航