編寫可以打開文本文件并打亂在該文件中所找到的單詞順序的vbs腳本
更新時(shí)間:2007年03月23日 00:00:00 作者:
問:
您好,腳本專家!我女兒有一種閃卡式程序,它能夠獲取文本文件中的單詞列表。我如何編寫一個(gè)腳本,使其能夠打開該文件并自動(dòng)打亂單詞列表的順序呢?
-- SN
答:
您好,SN。您知道,大多數(shù)情況下,我們盡力使此專欄關(guān)注實(shí)際的系統(tǒng)管理任務(wù):我們告訴您如何設(shè)置默認(rèn)打印機(jī)、如何禁用服務(wù)以及如何映射網(wǎng)絡(luò)驅(qū)動(dòng)器。不過,有時(shí)我們也愿意處理那種聽起來就很有趣的問題,而最終的結(jié)果有多大用處我們是不會(huì)去考慮的。系統(tǒng)管理員通常需要打亂文本文件中單詞列表的順序嗎?可能不需要。但是,若是只工作,不玩耍,想必聰明的小孩也會(huì)變傻,對(duì)不對(duì)?
實(shí)際上,有些小孩就算玩了也還是有點(diǎn)傻。但這是另外一回事。
明確這一點(diǎn)后,讓我們看一下可以打亂文本文件中單詞順序的腳本。正如我們說過的那樣,這樣的工作在實(shí)際當(dāng)中可能沒有一點(diǎn)用處,但它是有點(diǎn)挑戰(zhàn)性,并且也確實(shí)需要我們使用一點(diǎn)令人感興趣的腳本編寫小竅門。還有,如果不是這樣,您可能永遠(yuǎn)也不會(huì)知道這樣的竅門何時(shí)才能派上用場(chǎng)。
首先,假定您有個(gè)類似于下面這樣的文本文件,文件中的所有單詞按字母順序排列:
Apple
Banana
Carrot
Dog
Fish
Elephant
Giraffe
Horse
如何才能打亂這些詞的順序呢?使用像下面這樣的腳本即可:
Const ForReading = 1
Const ForWriting = 2
Set objDictionary = CreateObject("Scripting.Dictionary")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("c:\scripts\words.txt", ForReading)
i = -1
Do Until objFile.AtEndOfStream
strLine = objFile.Readline
objDictionary.Add strLine, strLine
i = i + 1
Loop
objFile.Close
Dim arrWords()
Redim arrWords(i)
intWordsLeft = i
z = 0
Do While intWordsLeft >= 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
Set objFile = objFSO.OpenTextFile("c:\scripts\words.txt", ForWriting)
For Each strItem in arrWords
objFile.WriteLine strItem
Next
objFile.Close
哦,當(dāng)然,這看起來有些不可思議;確實(shí)是件不可思議的差事(至少對(duì)系統(tǒng)管理員來講是這樣的)。但是,不管您相信與否,這其中是有邏輯的,我們也將逐步讓您明白這種邏輯。
腳本的第一部分確實(shí)相當(dāng)簡(jiǎn)單。我們定義一對(duì)常量 - ForReading 和 ForWriting,我們將在處理文本文件時(shí)使用這兩個(gè)常量。然后創(chuàng)建兩個(gè)對(duì)象:Scripting.Dictionary 和 Scripting.FileSystemObject。我們將使用 Dictionary 對(duì)象作為從文本文件中所讀取單詞的臨時(shí)倉(cāng)庫(kù);而使用 FileSystemObject 與該文本文件進(jìn)行實(shí)際的交互。
接下來使用 OpenTextFile 方法打開文件 C:\Scripts\Words.txt 以進(jìn)行讀取。(注意常量 ForReading 的使用。)下一步,創(chuàng)建一個(gè)計(jì)數(shù)器變量 i 并將其值設(shè)置為 -1;我們將使用此變量跟蹤文件中的單詞數(shù)。為什么 i 要從 -1 而不是 0 開始?因?yàn)槲覀円褂?nbsp;i 建立一個(gè)數(shù)組,并且由于數(shù)組中的第一項(xiàng)始終為 0(而不是 1),因此我們需要從 -1 開始。在我們讀取第一個(gè)單詞時(shí),i 將被設(shè)置為 0,盡管聽起來有些奇怪,但是大小為 0 的數(shù)組意味著該數(shù)組中包含一個(gè)數(shù)據(jù)項(xiàng)。
嗨,我們只是如實(shí)匯報(bào),至于原因我們可不曉得。
接下來是下面這段代碼:
Do Until objFile.AtEndOfStream
strLine = objFile.Readline
objDictionary.Add strLine, strLine
i = i + 1
Loop
我們?cè)谶@里所做的就是逐行讀取文件。對(duì)于文件中的每一行(即每個(gè)單詞),我們將該值賦給一個(gè)名為 strLine 的變量;隨后使用 Add 方法將該值添加到 Dictionary 對(duì)象之中,從而將 i 值加 1。文件讀取結(jié)束之后,所有的單詞都存儲(chǔ)在 Dictionary 對(duì)象之中,i 的值將為 7,這恰好是文件中的單詞數(shù)減 1。(為什么?因?yàn)槠渲泻?nbsp;8 項(xiàng)數(shù)據(jù)的數(shù)組的大小為 7。)
別擔(dān)心;到最后您應(yīng)該會(huì)明白其原因所在。
我們希望如此。
關(guān)閉文件之后,初始化數(shù)組 arrWords,設(shè)置其大小為 i (表示文本文件中的單詞數(shù)減 1)。同時(shí)將 i 值賦給變量 intWordsLeft,通過它我們將知道有多少單詞要被打亂順序。最后,將變量 z 的值設(shè)為 0;我們將使用 z 將已打亂順序的單詞填充到數(shù)組中。實(shí)際上,我們要做的就是從 Dictionary 中隨機(jī)取出一個(gè)單詞然后將其添加到數(shù)組中。因?yàn)閱卧~是以隨機(jī)的順序從 Dictionary 中取出的,因此它們?cè)跀?shù)組中的順序?qū)⒈弧按騺y”(以不同的順序存儲(chǔ))。
現(xiàn)在,到了很有趣的這部分。建立一個(gè) Do 循環(huán),其一直運(yùn)行到我們用完 Dictionary 對(duì)象中的所有單詞。接著使用下面這兩行代碼從 0 和 Dictionary 對(duì)象中數(shù)據(jù)項(xiàng)的數(shù)目(或者至少是數(shù)據(jù)項(xiàng)的實(shí)際數(shù)減 1,因?yàn)?nbsp;Dictionary 對(duì)象中的第一個(gè)數(shù)據(jù)項(xiàng)為第 0 項(xiàng))之間隨機(jī)選擇一個(gè)數(shù)字:
Ranndomize
rndWord = Int((intWordsLeft - 0 + 1) * Rnd + 0)
之后我們將 intWordsLeft 值減 1;這樣做是為了始終記住我們現(xiàn)在要處理的單詞比之前所處理的少了一個(gè)。
那么我們需要這個(gè)隨機(jī)數(shù)字做什么呢?我們現(xiàn)在要做的就是使用該值從 Dictionary 中隨機(jī)抽取一個(gè)單詞。為此,我們可以創(chuàng)建一個(gè) Dictionary 項(xiàng)的集合,然后在變量 strText 中存儲(chǔ)此隨機(jī)選擇的數(shù)據(jù)項(xiàng)數(shù)字的值:
colItems = objDictionary.Items
strText = colItems(rndWord)
換句話說,Banana 當(dāng)前為 Dictionary 中的第 1 項(xiàng)。假定在生成隨機(jī)數(shù)字的時(shí)候得到的是 1。這意味著我們將從 Dictionary 中將第 1 項(xiàng)的值取出;然后,也就意味著單詞 Banana 被存儲(chǔ)在變量 strText 中。
明白了嗎?從 Dictionary 中隨機(jī)取出一個(gè)單詞之后,我們即需要將該值存儲(chǔ)到某個(gè)地方。為此我們使用數(shù)組 arrWords,使 strText 成為數(shù)組中的第一項(xiàng):
Words(z) = strText
我們?nèi)绾沃涝撝祽?yīng)成為第一項(xiàng)?因?yàn)槲覀儗⒃撝蒂x給第 z 項(xiàng),而第 z 項(xiàng)等于 0。之后,我們立即將 z 加 1,z 將等于 1。這也意味著,通過循環(huán)下一次我們會(huì)將檢索到的值賦給數(shù)組中的第二項(xiàng)。
單詞 Banana 使用過之后,下一步就是將該單詞從 Dictionary 中刪除;否則我們可能會(huì)再次使用該單詞。要?jiǎng)h除此單詞,只需調(diào)用 Dictionary 對(duì)象的 Remove 方法,將變量 strText 作為要?jiǎng)h除的項(xiàng)進(jìn)行傳遞即可:
objDictionary.Remove(strText)
一切均順利完成之后,數(shù)組 arrWords 將包含一個(gè)從文本文件中所取出的已打亂順序的單詞的列表:
Banana
Elephant
Giraffe
Apple
Fish
Carrot
Horse
Dog
很好,是吧?隨后我們只要打開文件 Words.txt(這次是進(jìn)行寫入),然后使用已打亂順序的列表 arrWords 替換現(xiàn)有內(nèi)容即可:
Set objFile = objFSO.OpenTextFile("c:\scripts\words.txt", ForWriting)
For Each strItem in arrWords
objFile.WriteLine strItem
Next
objFile.Close
下次您的女兒(誰的女兒都一樣)運(yùn)行教育程序的時(shí)候,她所看到的將是以隨機(jī)方式顯示的單詞。
順便說一句,我們并沒有像人們所謠傳的那樣對(duì)此專欄的文本進(jìn)行了該腳本的測(cè)試。在您好,腳本專家!專欄中的單詞可不是隨機(jī)選擇的;每個(gè)單詞都是我們花了無數(shù)的時(shí)間進(jìn)行辛勤的探索和耕耘所得到的。
事實(shí)上,就在我們做完所有認(rèn)真細(xì)致的耕耘之后。我們的編輯又將所有單詞的順序隨機(jī)打亂。如果您能看到該專欄編輯之前的樣子,就一定會(huì)為它的美妙而吃驚不已?。ň庉嫺阶ⅲ耗吹降臅?huì)是這種編輯之前的情況:將您吃驚感到。使用不會(huì)但是單詞這個(gè)我“美妙”。)
您好,腳本專家!我女兒有一種閃卡式程序,它能夠獲取文本文件中的單詞列表。我如何編寫一個(gè)腳本,使其能夠打開該文件并自動(dòng)打亂單詞列表的順序呢?
-- SN
答:
您好,SN。您知道,大多數(shù)情況下,我們盡力使此專欄關(guān)注實(shí)際的系統(tǒng)管理任務(wù):我們告訴您如何設(shè)置默認(rèn)打印機(jī)、如何禁用服務(wù)以及如何映射網(wǎng)絡(luò)驅(qū)動(dòng)器。不過,有時(shí)我們也愿意處理那種聽起來就很有趣的問題,而最終的結(jié)果有多大用處我們是不會(huì)去考慮的。系統(tǒng)管理員通常需要打亂文本文件中單詞列表的順序嗎?可能不需要。但是,若是只工作,不玩耍,想必聰明的小孩也會(huì)變傻,對(duì)不對(duì)?
實(shí)際上,有些小孩就算玩了也還是有點(diǎn)傻。但這是另外一回事。
明確這一點(diǎn)后,讓我們看一下可以打亂文本文件中單詞順序的腳本。正如我們說過的那樣,這樣的工作在實(shí)際當(dāng)中可能沒有一點(diǎn)用處,但它是有點(diǎn)挑戰(zhàn)性,并且也確實(shí)需要我們使用一點(diǎn)令人感興趣的腳本編寫小竅門。還有,如果不是這樣,您可能永遠(yuǎn)也不會(huì)知道這樣的竅門何時(shí)才能派上用場(chǎng)。
首先,假定您有個(gè)類似于下面這樣的文本文件,文件中的所有單詞按字母順序排列:
Apple
Banana
Carrot
Dog
Fish
Elephant
Giraffe
Horse
如何才能打亂這些詞的順序呢?使用像下面這樣的腳本即可:
復(fù)制代碼 代碼如下:
Const ForReading = 1
Const ForWriting = 2
Set objDictionary = CreateObject("Scripting.Dictionary")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("c:\scripts\words.txt", ForReading)
i = -1
Do Until objFile.AtEndOfStream
strLine = objFile.Readline
objDictionary.Add strLine, strLine
i = i + 1
Loop
objFile.Close
Dim arrWords()
Redim arrWords(i)
intWordsLeft = i
z = 0
Do While intWordsLeft >= 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
Set objFile = objFSO.OpenTextFile("c:\scripts\words.txt", ForWriting)
For Each strItem in arrWords
objFile.WriteLine strItem
Next
objFile.Close
腳本的第一部分確實(shí)相當(dāng)簡(jiǎn)單。我們定義一對(duì)常量 - ForReading 和 ForWriting,我們將在處理文本文件時(shí)使用這兩個(gè)常量。然后創(chuàng)建兩個(gè)對(duì)象:Scripting.Dictionary 和 Scripting.FileSystemObject。我們將使用 Dictionary 對(duì)象作為從文本文件中所讀取單詞的臨時(shí)倉(cāng)庫(kù);而使用 FileSystemObject 與該文本文件進(jìn)行實(shí)際的交互。
接下來使用 OpenTextFile 方法打開文件 C:\Scripts\Words.txt 以進(jìn)行讀取。(注意常量 ForReading 的使用。)下一步,創(chuàng)建一個(gè)計(jì)數(shù)器變量 i 并將其值設(shè)置為 -1;我們將使用此變量跟蹤文件中的單詞數(shù)。為什么 i 要從 -1 而不是 0 開始?因?yàn)槲覀円褂?nbsp;i 建立一個(gè)數(shù)組,并且由于數(shù)組中的第一項(xiàng)始終為 0(而不是 1),因此我們需要從 -1 開始。在我們讀取第一個(gè)單詞時(shí),i 將被設(shè)置為 0,盡管聽起來有些奇怪,但是大小為 0 的數(shù)組意味著該數(shù)組中包含一個(gè)數(shù)據(jù)項(xiàng)。
嗨,我們只是如實(shí)匯報(bào),至于原因我們可不曉得。
接下來是下面這段代碼:
復(fù)制代碼 代碼如下:
Do Until objFile.AtEndOfStream
strLine = objFile.Readline
objDictionary.Add strLine, strLine
i = i + 1
Loop
我們?cè)谶@里所做的就是逐行讀取文件。對(duì)于文件中的每一行(即每個(gè)單詞),我們將該值賦給一個(gè)名為 strLine 的變量;隨后使用 Add 方法將該值添加到 Dictionary 對(duì)象之中,從而將 i 值加 1。文件讀取結(jié)束之后,所有的單詞都存儲(chǔ)在 Dictionary 對(duì)象之中,i 的值將為 7,這恰好是文件中的單詞數(shù)減 1。(為什么?因?yàn)槠渲泻?nbsp;8 項(xiàng)數(shù)據(jù)的數(shù)組的大小為 7。)
別擔(dān)心;到最后您應(yīng)該會(huì)明白其原因所在。
我們希望如此。
關(guān)閉文件之后,初始化數(shù)組 arrWords,設(shè)置其大小為 i (表示文本文件中的單詞數(shù)減 1)。同時(shí)將 i 值賦給變量 intWordsLeft,通過它我們將知道有多少單詞要被打亂順序。最后,將變量 z 的值設(shè)為 0;我們將使用 z 將已打亂順序的單詞填充到數(shù)組中。實(shí)際上,我們要做的就是從 Dictionary 中隨機(jī)取出一個(gè)單詞然后將其添加到數(shù)組中。因?yàn)閱卧~是以隨機(jī)的順序從 Dictionary 中取出的,因此它們?cè)跀?shù)組中的順序?qū)⒈弧按騺y”(以不同的順序存儲(chǔ))。
現(xiàn)在,到了很有趣的這部分。建立一個(gè) Do 循環(huán),其一直運(yùn)行到我們用完 Dictionary 對(duì)象中的所有單詞。接著使用下面這兩行代碼從 0 和 Dictionary 對(duì)象中數(shù)據(jù)項(xiàng)的數(shù)目(或者至少是數(shù)據(jù)項(xiàng)的實(shí)際數(shù)減 1,因?yàn)?nbsp;Dictionary 對(duì)象中的第一個(gè)數(shù)據(jù)項(xiàng)為第 0 項(xiàng))之間隨機(jī)選擇一個(gè)數(shù)字:
Ranndomize
rndWord = Int((intWordsLeft - 0 + 1) * Rnd + 0)
之后我們將 intWordsLeft 值減 1;這樣做是為了始終記住我們現(xiàn)在要處理的單詞比之前所處理的少了一個(gè)。
那么我們需要這個(gè)隨機(jī)數(shù)字做什么呢?我們現(xiàn)在要做的就是使用該值從 Dictionary 中隨機(jī)抽取一個(gè)單詞。為此,我們可以創(chuàng)建一個(gè) Dictionary 項(xiàng)的集合,然后在變量 strText 中存儲(chǔ)此隨機(jī)選擇的數(shù)據(jù)項(xiàng)數(shù)字的值:
colItems = objDictionary.Items
strText = colItems(rndWord)
換句話說,Banana 當(dāng)前為 Dictionary 中的第 1 項(xiàng)。假定在生成隨機(jī)數(shù)字的時(shí)候得到的是 1。這意味著我們將從 Dictionary 中將第 1 項(xiàng)的值取出;然后,也就意味著單詞 Banana 被存儲(chǔ)在變量 strText 中。
明白了嗎?從 Dictionary 中隨機(jī)取出一個(gè)單詞之后,我們即需要將該值存儲(chǔ)到某個(gè)地方。為此我們使用數(shù)組 arrWords,使 strText 成為數(shù)組中的第一項(xiàng):
Words(z) = strText
我們?nèi)绾沃涝撝祽?yīng)成為第一項(xiàng)?因?yàn)槲覀儗⒃撝蒂x給第 z 項(xiàng),而第 z 項(xiàng)等于 0。之后,我們立即將 z 加 1,z 將等于 1。這也意味著,通過循環(huán)下一次我們會(huì)將檢索到的值賦給數(shù)組中的第二項(xiàng)。
單詞 Banana 使用過之后,下一步就是將該單詞從 Dictionary 中刪除;否則我們可能會(huì)再次使用該單詞。要?jiǎng)h除此單詞,只需調(diào)用 Dictionary 對(duì)象的 Remove 方法,將變量 strText 作為要?jiǎng)h除的項(xiàng)進(jìn)行傳遞即可:
objDictionary.Remove(strText)
一切均順利完成之后,數(shù)組 arrWords 將包含一個(gè)從文本文件中所取出的已打亂順序的單詞的列表:
Banana
Elephant
Giraffe
Apple
Fish
Carrot
Horse
Dog
很好,是吧?隨后我們只要打開文件 Words.txt(這次是進(jìn)行寫入),然后使用已打亂順序的列表 arrWords 替換現(xiàn)有內(nèi)容即可:
復(fù)制代碼 代碼如下:
Set objFile = objFSO.OpenTextFile("c:\scripts\words.txt", ForWriting)
For Each strItem in arrWords
objFile.WriteLine strItem
Next
objFile.Close
順便說一句,我們并沒有像人們所謠傳的那樣對(duì)此專欄的文本進(jìn)行了該腳本的測(cè)試。在您好,腳本專家!專欄中的單詞可不是隨機(jī)選擇的;每個(gè)單詞都是我們花了無數(shù)的時(shí)間進(jìn)行辛勤的探索和耕耘所得到的。
事實(shí)上,就在我們做完所有認(rèn)真細(xì)致的耕耘之后。我們的編輯又將所有單詞的順序隨機(jī)打亂。如果您能看到該專欄編輯之前的樣子,就一定會(huì)為它的美妙而吃驚不已?。ň庉嫺阶ⅲ耗吹降臅?huì)是這種編輯之前的情況:將您吃驚感到。使用不會(huì)但是單詞這個(gè)我“美妙”。)
相關(guān)文章
VBS教程:VBscript語句-If...Then...Else 語句
If...Then...Else 語句用于計(jì)算條件是否為 True 或 False,并且根據(jù)計(jì)算結(jié)果指定要運(yùn)行的語句。通常,條件是使用比較運(yùn)算符對(duì)值或變量進(jìn)行比較的表達(dá)式。If...Then...Else 語句可以按照需要進(jìn)行嵌套2006-11-11Dynamic Activity Window動(dòng)態(tài)活動(dòng)窗口vbs
Dynamic Activity Window動(dòng)態(tài)活動(dòng)窗口2008-12-12VC中實(shí)現(xiàn)文字豎排的簡(jiǎn)單方法(推薦)
下面小編就為大家?guī)硪黄猇C中實(shí)現(xiàn)文字豎排的簡(jiǎn)單方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-05-05iis PHP安裝腳本 PHPInstall.vbs V3.1
PHP安裝腳本,您所要做的操作是:保存這個(gè)文件與要安裝的php文件夾放一起(不要放在C盤根目錄下)2009-07-07